本文已参与「新人创作礼」活动,一起开启掘金创作之路。
注意:二分的前提是有序模板一
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用
void 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]时使用
void 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;
}
分享一个我觉得最容易理解的说法
假设有一个总区间,经由我们的 check 函数判断后,可分成两部分,
这边以o作 true,.....作 false 示意较好识别
如果我们的目标是下面这个v,那么就必须使用模板 1
................vooooooooo
假设经由 check 划分后,整个区间的属性与目标v如下,则我们必须使用模板 2
oooooooov...................
注:v也是true的