首页 > 其他 > 详细

二分内容整理(待补充

时间:2020-05-01 09:50:31      阅读:57      评论:0      收藏:0      [点我收藏+]

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

二分

整数

对于单调递增序列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,该值就是答案所在的位置。

二分内容整理(待补充

原文:https://www.cnblogs.com/Aracne/p/12812269.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!