二分查找模板(屡试不爽)
作者:yxc
链接:https://www.acwing.com/blog/content/31/
来源:AcWing
二分模板一共有两个,分别适用于不同情况。
算法思路:假设目标值在闭区间[l, r]
中, 每次将区间长度缩小一半,当l = r
时,我们就找到了目标值。
版本1(mid包含在左半边区间)
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
java代码模板:
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;
}
版本2 (mid包含在右半边区间)
当我们将区间[l, r]
划分成[l, mid - 1]
和[mid, r]
时,其更新操作是r = mid - 1
或者l = mid;
,此时为了防止死循环,计算mid时需要加1。
Java 代码模板:
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;
}
关于mid 不加 1 会出现死循环的情况:
当 l = r - 1
时,更新左边界 mid = l + r >> 2
,mid
此时还等于原左区间,会出现死循环,
所以更新时为 mid = l + r + 1