public int search(int key, int[] array) {
int l = 0, h = array.length - 1;
while (l <= h) {
int mid = l + (h - l) / 2;
if (key == array[mid]) return mid;
if (key < array[mid]) h = mid - 1;
else l = mid + 1;
}
return -1;
}
注意细节:mid =(l+h) / 2时 如果 l+h >Integer.MAX_VALUE 会导致加法溢出
所以用 mid = l + (h-l) / 2
例题
实现sqrt
//一个数的平方根一定位于0-x之间 而且sqrt == x/sqrt
class Solution {
public int mySqrt(int x) {
if(x <= 1)
return x;
int l = 0;
int h = x;
int mid;
while(l <= h){
mid = l + (h-l)/2;
int sqrt = x/mid;
if(mid == sqrt)
return mid;
else if(sqrt < mid)
h = mid - 1;
else
l = mid + 1;
}
//return h 也就是没找到mid的时候 因为循环结束时 l>=h,如果 l=h,返回h、l没影响,如果l> h
//根据int 的特性 是向左取值的,所以必须返回h
return h;
}
}