LeetCode—278. First Bad Version
题目
有1到n编号的n个产品,从第i个产品开始有生产线造成的瑕疵,导致i以后的所有产品都有问题,提供判断产品是否有问题的api函数isBadVersion(i),要求找到第一个有瑕疵的产品,最小化调用api的次数
https://leetcode.com/problems/first-bad-version/description/
思路及解法
很容易想到使用二分查找的方法,分别设置left,mid,right标志位,循环迭代mid=(left+right)//2,并判断mid是不是瑕疵产品。为了最小化调用api的次数,需要一些trick,不单纯的是二分查找的方法。首先,如果判断mid是瑕疵产品,下一步应该去判断mid的前一个是不是瑕疵,如果不是,那么直接返回mid就好了,如果是,说明mid不是第一个瑕疵产品,这时候要将right放到mid-1,在改变mid;如果一开始判断mid就不是瑕疵产品,那么就应该吧left放到mid+1,在改变mid。所以整个过程只对mid和mid-1进行判断是不是瑕疵产品。
代码
class Solution(object):
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
first = 1
last = n
while first <= last:
mid = (first + last)//2
if isBadVersion(mid) == True:
if isBadVersion(mid-1) == False:
return mid
else:
last = mid-1
else: # isBadersion(mid) == False
first = mid+1