二分模板
默认数组元素是非递减的。
寻找数组中大于target的右面第一个数字的下标
int bisearch(int l , int r) {
//此处不加等号
while(l < r) {
int mid = l+r >> 1;
if(a[mid] > target) r = mid;
else l = mid + 1;
}
return l;
}
寻找数组中小于target的左面第一个数字的下标
int bisearch(int l, int r) {
while(l < r) {
int mid = l+r+1 >> 1;
if(a[mid] < target) l = mid;
else r = mid - 1;
}
return l;
}
寻找数组中大于等于target的最左面的数字的下标
while(l < r) {
int mid = l+r >> 1;
if(a[mid] >= t) r = mid;
else l = mid + 1;
}
return l;
寻找数组中小于等于target的最右面的数字的下标
int bisearch_2(int l, int r) {
while(l < r) {
int mid = l+r+1 >> 1;
if(a[mid] <= t) l = mid;
else r = mid - 1;
}
return l;
}
从上面可以总结出:
对于while里面的条件,可以总是设置为l<r
对于mid,有两种选择:
-
mid=(l+r)>>1 配合 l=mid+1,r=mid
这种情况下最终结果会因为mid的选择偏向左边
-
mid=(l+r+1)>>1配合l=mid,r=mid-1
这种情况下最终结果会因为mid的选择偏向右边

浙公网安备 33010602011771号