重新开始写一遍二分吧。其实看起来很简单,但是写的时候细节确实很多,不小心就会写错。
功利一点,先从板子开始吧。
bool check(int x)
{ /* ... */
} // 检查x是否满足某种性质
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
while (l < r) {
int mid = l + r >> 1;
if (check(mid))
r = mid; // check()判断mid是否满足性质
else
l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
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;
}
主体真的很简单,整个流程:
while
循环l , r
中间值,那怎么判断是否需要 +1
呢:
if
l
,则 +1
r
,则无需 +1
l
还是 r
都要保证这一点l
或 r
,接在条件为真的时候,左右端点均保持原样即可l
或 r
,和步骤二相反:
l
,则不变r
,则必须 -1
l
参考博客:
原文:https://www.cnblogs.com/Salty-Fish/p/15349675.html