02二分

二分

问题

适用于一个序列,有一个check函数,能够使得序列左边都返回false,右边都返回true,然后我们找的就是这个分界点的时候

基本思想

两种情况
一种是求 左半段最后一个元素,也就是说求上界,比如求 小于等于 x 的最后一个元素
这时候 mid = l + r + 1 >> 1;

bool check(int mid , int x){
    return q[mid] <= x;
}
if(check(mid,x)) l = mid;
else r = mid - 1;

另一种情况是求 右半段的第一个元素,也就是求下界,比如求 大于等于 x 的第一个元素
这时候 mid = l + r + 1 >> 1;

bool check(int mid , int x){
    return q[mid] >= x;
}
if(check(mid,x)) r = mid;
else l = mid + 1;

模板

给定一个序列 q , 求大于等于 x 的第一个值 右半段的第一个

bool check(int mid , int x){
    return q[mid] >= x;
}
int l = 0, r = n - 1, mid;
while (l < r)
{
    mid = l + r >> 1;
    if (check(mid, x)) r = mid;
    else l = mid + 1;
}
if(q[l] == x) ...

给定一个序列 q , 求小于等于 x 的最后一个值 左半段的最后一个

bool check(int mid , int x){
    return q[mid] <= x;
}
int l = 0, r = n - 1, mid;
while (l < r)
{
    mid = l + r + 1 >> 1;
    if (check(mid, x)) l = mid;
    else r = mid - 1;
}
if(q[l] == x) ...

原文链接: https://www.cnblogs.com/da-zhi/p/17019626.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    02二分

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/309116

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 上午10:52
下一篇 2023年2月16日 上午10:52

相关推荐