整数二分法查找左右边界
第一种是查找左边界(我这里指的是整体右边部分的分界点,即所求区间的左边)
int bsearch_1(int l, int r)
{
//第二步:递归处理子问题,用while循环来实现
while (l < r)
{
//第一步:分解成子问题,这是二分的核心--范围减半
int mid = l + r >> 1;
if (check(mid)) r = mid; //向左边找 //if判断mid是否满足性质,注意该性质会划分数组的右边部分
else l = mid + 1; //向右边找
}
//第三步:合并子问题.对二分算法来说,不需要这一步
return l; //l就是寻找的右分界点,如果数组中没有要找的点,l的值就是r,但这是一个错误答案
}
第二种是查找右分界点
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1; // mid 向上取整
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
写代码技巧:当分界点为x,应当认为左边界和mid分别位于边界点的两侧,这样更容易记忆模板
其实代码里的 check(mid)函数是怎样写的,影响了l,r边界点的更新
详细见
下面是另一个博主较为详细的分析两个模板为什么不一样
二分法模板及其原理分析