- 不能写 int mid = (lo + hi) / 2; 要写 int mid = lo + (hi - lo) / 2;
- 这个题目,返回 lo 或者 hi 都行,因为终止条件是 lo == hi.
- 找的是分割点,不是某个值。
[********########] 就像这样的有序数组,找第一个 # 号。
二分搜索的演化版本,查找某个值,返回其索引,如果找不到,返回其本来应该所在的位置(比如上面 # 号的位置)。遇到这种二分搜索,就拿这个 bad version 来套就行了。
代码如下:
int firstBadVersion(int n) {
int left=1;
int right=n;
int mid;
while(left<right){
mid=left+(right-left)/2;
if(isBadVersion(mid))
right=mid;
else
left=mid+1;
}
return left;//终止条件是left==right
}