Leetcode 칫솔질 기록(2): 278 첫 번째 잘못된 버전 isBadVersion(version)

브러시 질문 웹사이트: 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인터페이스를 부르는 의미를 알게 되었습니다. 알고리즘 아이디어는 여전히 이진 검색 방식으로 이전과 약간 다르므로 더 많은 관심을 기울이고 더 많이 연습하는 것이 좋습니다.

추천

출처blog.csdn.net/A33280000f/article/details/121136160