二分的本质是求边界,两套模板求的分别是满足条件的左边界还是满足条件的右边界。我们用一个例子来解释(单调可二分,二分非单调,这里我们用一个片面的单调例子来解释)
已知 一个序列为 2 3 4 4 5 6 取4最早出现的位置可以等价看作寻找大于等于四的区间的左边界
取四最晚的位置可以等价求小于等于四区间的右边边界问题。
针对左右边界mid取值解释:
本质探究的是(l+r)/2是整数还是小数
1.针对(l+r)/2 是小数
求左边界,答案则在左边界上可取,因此当为序位小数这类的时候要向下取整(向下则是在向左边界靠齐)。
针对右边界问题,右边界可取,因此当为序为小数的时候向上取整(因此有了+0.5 变成了 (l+r+1)>>1)
2.针对(l+r)/2 是整数的问题,mid就取其整数
针对左边界:mid=(l+r)/2
针对有边界 mid=(l+r)/2,与mid(l+r+1)/2 在取整上数值相等
因此统一下针对左边界 l+r>>1,针对求有边界l+r+1>>1