설명 :
당신은 제품 관리자이며, 현재 새로운 제품을 개발하는 팀을 이끌고. 불행하게도, 제품의 최신 버전은 품질 검사를 실패합니다. 각 버전은 이전 버전을 기반으로 개발되어 있기 때문에, 나쁜 버전 이후의 모든 버전도 엉망이다.
당신이 N 버전 [1, 2, ..., N]을 가지고 있고 다음의 모든 사람이 나쁜 원인 첫 번째 나쁜 하나를 발견 할 가정하자.
당신은 버전이 불량인지 여부를 반환하는 API의 부울 isBadVersion (버전)이 제공됩니다. 첫 번째 잘못된 버전을 찾을 수있는 기능을 구현합니다. 당신은 API 호출의 수를 최소화해야한다.
예 :
감안 N = 5 = 버전 및 4는 제 1 불량 버전이다.
전화 isBadVersion (3) -> 거짓
전화 isBadVersion (5) -> 실제
통화 isBadVersion (4) -> 사실
그리고도 4는 제 1 나쁜 버전입니다.
주제 설명 :
당신은, 제품 관리자입니다 현재 새로운 제품을 개발하기 위해 팀을 선도하고 있습니다. 불행하게도, 제품의 최신 버전은 품질 검사를 통과하지 않았다. 각 버전의 개발의 이전 버전을 기반으로하기 때문에, 그래서 잘못된 버전의 모든 이후 버전이 잘못되었습니다.
당신이 N 버전 [1, 2, ..., n]은, 당신이 버전 오류 후 잘못된 버전으로 먼저 리드의 발견하려는 있다고 가정합시다.
당신은 단위 테스트에 버전 번호 버전의 오류 여부를 결정하는 부울 isBadVersion (버전) 인터페이스를 호출 할 수 있습니다. 첫 번째 잘못된 버전을 찾을 수있는 기능을 구현합니다. 당신은 API 호출의 수를 줄이기 위해 시도해야합니다.
예 :
N 감안할 = 5, 그리고 첫 번째 버전은 = 4는 잘못된 버전입니다.
전화 isBadVersion (3) -> 거짓
통화 isBadVersion (5) -> 진정한
호출 isBadVersion (4) -> 사실
그래서 4는 제 1 잘못된 버전입니다.
아이디어 :
이진 검색, 경계 조건과 오버 플로우에주의
시간 복잡도 O (LGN), 공간 복잡도 O (1)
코드 :
C ++ :
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int low = 1;
while (low < n) {
int mid = low + ((n - low) >> 1);
if (isBadVersion(mid)) n = mid;
else low = ++mid;
}
return low;
}
};
자바 :
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int low = 1;
while (low < n) {
int mid = low + ((n - low) >> 1);
if (isBadVersion(mid)) n = mid;
else low = ++mid;
}
return low;
}
}
파이썬 :
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return a bool
# def isBadVersion(version):
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
low = 1
while low < n:
mid = low + ((n - low) >> 1)
if isBadVersion(mid):
n = mid
else:
low = mid + 1
return low