模板1:
while(l<r){
int mid=(l+r)/2;
if(num[mid]>=target) r=mid;//选取左边区间再次进行搜索
else l=mid+1;
}
模板2:
while(l<r){
int mid=(l+r+1)/2;
if(num[mid]<=target) l=mid;//选取右边区间再次进行搜索
else r=mid-1;
}
二分的最后退出条件都是l=r
模板1是尽量往左找目标,搜索出来的L是第一个 ≥ x的下标(除了x大于数组最后一个值,此时L和 r只能指向数组最后一个值)
模板2是尽量往右找目标,搜索出来的L是最后一个 ≤ x的下标(除了x小于数组第一个值,此时L和r只能指向数组第一个值)
模板3(浮点二分):
while(r-l>1e-5){//需要一个精度保证
duoble mid=(l+r)/2;
if(check(mid)) l=mid;//或r=mid
else r=mid;//或l=mid
}
浮点二分就相对简单多了,因为浮点除法不会取整,所以mid,l,r,都不用加1或减1。