二分内容整理(待补充

内容来算法竞赛进阶指南,我把自认为的重点写了下来,方便查看

二分

整数

对于单调递增序列a中查找>=x的数中最小的一个:

while(l<r)
{
    int mid=(l+r)>>1;
    if(a[mid]>=x)
        r=mid;
    else
        l=mid+1;
}
cout<<l<<endl;

对于单调递增序列a中查找<=x的数中最大的一个:

while(l<r)
{
    int mid=(l+r+1)>>1;
    if(a[mid]<=x)
        l=mid;
    else
        r=mid-1;
}
cout<<l<<endl;

r,l的取值简单的数学知识就能看懂。
关键是俩个写法的的mid的取值,如果对第二段代码也是(l+r)>>1,那么当r-l等于1时候,就有mid=(l+r)>>1=l。
若是进入l=mid,则死循环,若进入r=mid-1,则l>r,循环不能以l>r结束。(能用<<1别/2,因为右移是向下取整而除法是向零取整。可能会发生意想不到的错误)

步骤:

1.分析问题,左右区间那个是可行区间,以及mid归属哪一半段。

2.根据分析结果选择代码1或者代码2。

3.二分的中止条件即l==r,该值就是答案所在的位置。

猜你喜欢

转载自www.cnblogs.com/Aracne/p/12812269.html