基础版本-整数
//第一种情况,最后答案是r
public int search(long l, long r) {
while(l<r){
long mid=l+r>>1;
//int 版本 : int mid = l+(r-l)/2
if(check(mid)){
r = mid
}
else{
l = mid+1
}
}
}
//第二种情况,最后答案是l
public int search(long l, long r) {
while(l<r){
long mid = l+r+1>>1;
if(check(mid)){
l = mid
}
else{
r = mid-1
}
}
}
浮点数二分
double search(double l, double r)
{
final double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
//浮点数的二分能精确取到l和r的中间值,所以不用补1
//整数二分是因为二分是像下取整,如果l=r-1,那么r+l>>1==l,还是区间(l,r)死循环了
if (check(mid)) r = mid;
else l = mid;
}
return l;
}