브러시 질문 웹사이트: Leetcode
난이도: 쉬움
언어: 파이썬
계획 : 쉬움 -> 중간 -> 어려움.
1. 278의 첫 번째 잘못된 버전
1.1 문제 설명
버전 개발에서 잘못된 버전 이후의 모든 버전이 잘못된 것으로 가정합니다. n
모든 후속 버전을 실패하게 만든 첫 번째 잘못된 버전 [1,2,...,n]
을 찾으려면 버전이 있습니다 .
인터페이스 를 호출하여 단위 테스트에서 버전 번호가 잘못된 bool isBadVersion(version)
것인지 판단 할 수 있습니다. version
첫 번째 잘못된 버전을 찾는 함수를 구현하면 API에 대한 호출 수를 최소화해야 합니다.
- 실시예 1
输入:n=5,bad=4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
- 실시예 2
输入:n = 1, bad = 1
输出:1
1.2 사고와 분석
처음에는 제목의 의미를 잘못 이해하거나 제목을 이해하지 못하기 쉽습니다. 다음 두 가지 사항에 유의하십시오.
- 1) 예를 들어 버전 번호 는 옳고 그름 을 의미하는
[1,2,3,...n]
옳고 그름의 형태로 표현되며 , 제목은 처음 나오는 위치를 요구한다 .[********######]
*
#
#
- 2)
isBadVersion(3) -> false
이 문장의 의미는 단순히 틀렸음을false
이해하는 것이 아니라 틀렸는isBadVersion()
지 여부를 판단하는 것으로false
이중 부정이 긍정과 같으면 이 문장은 버전이 맞다는 것이고 그렇지 않으면isBadVersion(4) -> ture
네 번째 버전 번호가 잘못되었습니다.
질문의 의미를 이해한 후 해당 코드를 작성할 수 있습니다. 이 질문은 이전 704 배열의 이진 검색 과 유사한 이진 분류 방법이기도 합니다 .
1.3 문제 해결 프로세스
우선 콘솔에서 초기 코드를 제공하므로 나중에 작성하기만 하면 됩니다.
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
이 질문은 이미 isBadVersion API
인터페이스가 정의되어 있고 이미 존재한다고 가정하며 직접 정의할 필요가 없다고 말했습니다. 따라서 이 질문은 pycharm에서 디버깅할 수 없으며 leetcode에서 로컬로만 디버깅할 수 있습니다.
- (1) 먼저 앞의 방법과 달리 여기에서는 아래첨자 인덱스를 사용하지 않고 1부터 n까지의 버전번호를 직접 사용하므로 왼쪽 끝의 초기값을 1로 정의해야 한다.
left=1
- (2) 그런 다음 첫 번째 오류의 위치인지 여부를 확인하는 루프가 필요합니다. 루프 설정을 위한 조건은 작성할 수 없지만 작성
left<=n
해야 합니다left<n
. 그렇지 않으면 무한 루프에 빠지고 시간 제한을 초과합니다. 즉, 두 개 이상의 버전 번호가 있는지 확인합니다.
while left<n:
- (3) 마지막으로 인터페이스 여부를 호출하는 판단문을 추가해야 합니다
true
. 처음에는 어떻게 불러야 할지 몰라서isBadVersion() API
제목을 그대로 따라해서 썼습니다.
if isBadVersion() -> true:
\qquad그러나 실행 후에는 항상 다음 오류가 표시됩니다.
SyntaxError: invalid syntax
\qquad->
공통으로 변경 하면 ==
다음 오류가 발생합니다 .
NameError:name'ture' is not defined
\qquad나중에 생각해 isBadVersion()
보면 이미 정의되어 있기 때문에 문제가 없어야 합니다. 즉, 나중에 문제가 있는 것입니다. if
조건이 성립된 후 문장을 생각하고 실행한다. 그래서 나는 단순히 등을 제거하고 성공했다.
if isBadVersion():
- (4) 최종 코드는 다음과 같습니다.
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
left = 1
while left<n:
mid = (n-left)//2 + left
if isBadVersion(mid):
n = mid
else:
left = mid + 1
return left
실행 결과는
95.9%의 사용자가 패배하였으므로 알고리즘은 나쁘지 않을 것입니다.
1.4 요약
이 질문의 요점은 질문의 의미를 이해하는 것인데 처음에는 이해를 못했는데 댓글을 읽고서야 API
인터페이스를 부르는 의미를 알게 되었습니다. 알고리즘 아이디어는 여전히 이진 검색 방식으로 이전과 약간 다르므로 더 많은 관심을 기울이고 더 많이 연습하는 것이 좋습니다.