二分查找【重复学习】

看了下知乎上关于二分的问题,二分有几种写法,有什么区别
果然一千个人有一千种哈姆雷特。。。
不断重复也是学习,虽然可能效率不高。
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。
下界:与上界相反。

猜你喜欢

转载自blog.csdn.net/khn64/article/details/79699680