学习acwing中yxc的二分模板记录的笔记。
一. 二分模板分两种情况:
1. 找某区间左边界问题:
当mid在左边界到r之间时:
说明要找的左边界在mid左边,则r=mid;
否则l=mid+1;
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;//当mid在左边界到r之间时
else l = mid + 1;//当mid不在左边界到r之间时
}
return l;
}
2. 找某区间右边界问题:
当mid在l到右边界之间时:
说明要找的右边界在mid右边
则l=mid;
否则r = mid-1;
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;//为什么要+1
if (check(mid)) l = mid;//当mid在l到右边界之间时
else r = mid - 1;
}
return l;
}
二 . 关于找右边界时为什么计算mid时要+1:
如果在二分过程中出现这种情况,mid一直逼近于r,mid和r刚好相邻时,比如mid在arr[5],r在arr[6],此时计算mid时,若不+1,则mid的结果会下取整得mid=5,此时mid的序号没变,会陷入死循环。
而+1,mid的结果会上取整得mid=6,则不会死循环。
三. 关于返回值为什么是l:
也可以是r,因为二分循环结束条件是r=l
二分结束前的状态只有两种:
1.当找左边界时:
( 由于是mid计算是向下取整,所以相邻时mid指向l)
此时无论是执行r=mid;还是l=mid+1;最终都会l=r;
2.当找右边界时:
( 由于是mid计算是向上取整,所以相邻时mid指向r)
此时无论是执行l=mid;还是r=mid-1;最终都会l=r;
综上:循环最终会因为r=l而结束,所以返回r还是l都行。
记忆:
左+r,右-l,rl相等停。