二分查找【重复学习】

看了下知乎上关于二分的问题,二分有几种写法,有什么区别
果然一千个人有一千种哈姆雷特。。。
不断重复也是学习,虽然可能效率不高。
1.非下降序列

1.1 下界

当v存在时,返回它出现的第一个位置。如若不存在,返回这样一个下标i(在此处插入v后,序列依旧有序)。

int bsea(int n, ll v){
    int m;
    int x = 0, y = n;
    while(x<y){
        m = x + (y-x)/2;
        if(q[m]>=v) y = m; // 换成条件即可
        else x = m + 1;
    }
    return x;
}

1.2 上界
当v存在时返回它出现的最后一个位置的后面。
如若不存在返回这样一个下标(在此处插入v后序列依然有序)。

int bsea(int n, ll v){
    int m;
    int x = 0, y = n;
    while(x<y){
        m = x + (y-x)/2;
        if(q[m]<=v) x = m+1;
        else y = m;
    }
    return x;
}

由上可得出其实二分查找上、下界的写法只是在满足条件情况下先改变谁有区别。
上界: 若满足条件,需要选择那个大的。所以应该更新左端点。也就是先动x。
下界:与上界相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值