一、二分查找的公式
int l, r; //[l, r)
while(l < r)
{
int mid = l + ((r - l) >> 1);
if(mid == target) returm mid;
if(f(mid))
r = mid;
else
l = mid + 1;
}
return l; // l is the first one that meets the condition f(x).
二、几个注意点
1、上述公式中的区间是左闭右开,因此在初始化时,r常常为初始范围的最大值加1。涉及到加1的时候需要考虑整型数越界的问题,例如对于int来说,如果初始范围最大值为INT_MAX,那么INT_MAX+1便会出bug,此时需要单独对INT_MAX的情形进行判断。
2、若区间采用左闭右闭,若需要查找的数≥初始范围的最大值,需要在l == r时再对l进行判断,是否满足f(l)。
3、mid = l + ((r - l) >> 1) 好于 mid = l + (r - l) / 2 好于 mid = (l + r) / 2。