算法基础--二分

二分的本质不是单调性!是区间,具有二段性 

单调一定可以用二分做,但不单调有时也可以用二分,只要能把区间分开就可以(二段性)。

整数二分

最麻烦的是边界的考虑

算法思路

模板一(红色区域):

while(l<r)
{
    int mid=(l+r+1)/2;
    if(check(mid))l=mid;
    else r=mid-1;
}

模板二(蓝色区域):

while(l<r)
{
    int mid=(l+r)/2;
    if(check(mid))r=mid;
    else l=mid+1;
}

注意问题:

1.为啥模板一里的mid要+1呢?当r=l+1,更新区间【l,mid】时mid=(l+l+1)/2(下取整)=l

2.if(check(mid))取true时,证明mid在check区间中,所以要把mid取上。

若为false,说明mid不能取,最多mid-1或者mid+1能取

浮点数二分

直接除就行

模板

while(r-l>1e-8)
{
    double mid=(l+r)/2;
    if(mid*mid>=x) r=mid;
    else l=mid;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值