题目描述:
解题思路:
二分法
为了尽量减少对API——isBadVersion(version)的调用,所以尽量减少查找的次数。结合题目的应用场景,这个产品是有规律的:前面都是好的版本,从第一个错误版本出现之后,它(我们要找到版本号)后面的版本号都是错误的。
我们考虑使用二分查找的思路去寻找第一个错误的版本号,以尽量减少调用API的次数(查找次数)。
结合情况,可以得到三种情况:
(1)mid版本是坏的,mid-1版本是好的,那么mid就是要找的第一个错误版本。
(2)mid版本是坏的,mid-1版本也是坏的,那么要找的第一个错误版本只可能在mid-1以及以前。
(3)mid版本是好的,mid-1版本是坏的。结合题目描述,这种情况是不可能的!X
(4)mid版本是好的,mid-1版本也是好的,那么要找的第一个错误的版本只可能是在mid+1以及之后。
代码以及注释:
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
start = 1
end = n
while (start <= end):
mid = (start + end) // 2
# mid是坏的,mid-1是好的,那么mid就是要找的第一个坏的版本号
if isBadVersion(mid) == True and isBadVersion(mid-1) == False:
return mid
# mid是坏的,mid-1也是坏的,那么第一个坏的版本在mid-1以及以前
elif isBadVersion(mid) == True and isBadVersion(mid-1) == True:
end = mid-1
# mid是好的,mid-1是好的,那么坏的一定在mid+1以及之后
elif isBadVersion(mid) == False and isBadVersion(mid-1) == False:
start = mid + 1