二分算法
二分模板列举:
首先,二分算法可以分为两个部分以下均以数组中存在多个X为例,第一种是寻找第一个X,代码如下:
其中l代表左边界,r代表右边界
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]>=o)r=mid;//如果满足条件右边就移回来
else l=mid+1;
}
第二种是寻找最后一个X ,代码如下 :
while(l<r)
{
int mid = l+r+1>>1; //这里采用了位运算的写法,意思表达和上面是一样的
if(a[mid]<=o)l=mid; //注意这里是l=mid,所以要记得把l+r再加上一,否则会死循环
else r=mid-1;
}
这道题可以很好的练习这两种方法,AcWing 789. 数的范围
总结:
从上面三个题中,我发现只要数据具有二段性就可以使用二分法,或者通俗点说,就是具有单调性的数据可以使用,所谓单调性就是假设有一个值X,如果这个值的前面都不满足条件(或者都满足条件),这个值之后都满足条件(或者都不满足条件),那么这组数据就有单调性,这时我们就可以用二分法对X进行选择