题目描述
思路
这里其实是找出数组类型为:[***********############]
中,第一个出现的#
的问题,可以归类为二分查找,但是这道题不能视为普通的二分查找问题:
普通的二分查找模板是:
- 定义左边界 left
- 定义右边界 right
- 定义中间值 mid = (left + right)/2
但是这道题应该将中间值定为: mid = left + (right-left)/2
原因是:当left和right都是int类型时,如果两个值的初始值都超过int限定大小的一半,那么left+right就会发生溢出,所以应该用left+(right-left)/2来防止求中值时候的溢出
代码
public class Solution extends VersionControl {//二分查找
public int firstBadVersion(int n) {
if(n == 1)return 1;
int right = n;
int left = 1;
int mid = (1+n)/2;
while(left <= right){
//mid = (left+right)/2;
mid = left+(right-left)/2;
if(isBadVersion(mid)){//如果当前版本存在错误
if(!isBadVersion(mid-1))return mid;//如果当前版本的前一个版本是正确的
else{//如果当前版本的前一个版本是错的
right = mid-1;
}
}else{//如果当前版本不存在错误
left= mid+1;
}
}
return left;
}
}