题目
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:
给定 n = 5,并且 version = 4 是第一个错误的版本。 调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true 所以,4 是第一个错误的版本。
解题
1个个查找过去不符合题目要求,于是使用二分查找
方法一:二分查找
python解法
# 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 """ left, right = 1, n while left < right: mid = (right + left) // 2 if isBadVersion(mid): right = mid else: left = mid + 1 return left
例 F,F,T,T,T,T
我们要取得是第一个T,第一轮循环,如果right = mid-1,那么就会越过我们需要得T,就再也找不到了。
因此right = mid
不过这种,具体还是因情况而定,最好举个例子试一试,就知道该不该多个1还是少个1。
c++解法
class Solution { public: int firstBadVersion(int n) { int left=1,right=n; while(left<right){ int mid=left+(right-left)/2; if(isBadVersion(mid)==false){ left=mid+1; } else{ right=mid; } } return left; } };