二分的模板
二分的思想:
假设目标值在闭区间
[l,r]
中,每次将区间长度缩小一半,当l=r
时,我们就找到了目标值.
两种模板
- 划分为
[l,mid]
和[mid+1,r]
. 更新操作为r=mid
或者l=mid+1
,计算mid
时不需要加1
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
- 划分为
[l,mid-1]
和[mid, r]
时,更新操作为r = mid - 1
或者l = mid
,此时为了防止死循环,计算mid
时需要加1
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}