题目描述:
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
该题可以采用暴力法求解,循环遍历数组找到第一个错误的版本。但是需要减少调用bool isBadVersion(version) 接口的次数,所以采用二分查找。
如上图所示,第一个错误版本就是我们查找的目标,他的前一个版本是正确版本,这是对目标的判断条件。
初始化两个指针left和right,分别指向0和n-1
中点采用 mid = left+((right-left)>>1); 的方法来取
//待查找的目标值就是false和true的分界点
int firstBadVersion(int n) {
int left=0,right=n-1;
int mid;
while(left<=right)
{
mid = left + ((right-left)>>1); //注意中间值的取法
if(isBadVersion(mid) == false) //如果mid为false 说明查找目标在右侧区间
{
left = mid+1;
}
if(isBadVersion(mid) == true) //如果mid为true 需要判断是不是目标值
{
if(isBadVersion(mid-1) == false)//如果mid的前一个时false 说明是目标值 返回mid即可
{
return mid;
}
else
{
right = mid-1; //如果mid的前一个不是false 则说明目标值在左侧区间
}
}
}
return left;
}
如有不当之处,还请各位予以指正。