二分(学习自用)

本文详细解释了二分查找算法中的边界处理策略,介绍了两种模板(bsearch_1和bsearch_2),并解释了mid+1的原因,确保在最后l=r时边界不是mid,而是通过l=mid+1或r=mid-1进行更新。
摘要由CSDN通过智能技术生成

二分概述

二分就是能比暴力枚举能用更少的时间复杂度找出边界点。

一个长为n的数组,(l,r分别为左右边界)具有某种性质,能够将数组分成两半,例如左边满足右边不满足。

二分思想  模板

现求左边部分的边界:mid=l+r>>1+1,if(check(mid)==true),即mid在左边部分,令 l=mid;if(check(mid)==false),即mid在右边部分,r=mid-1;

现求右边部分边界:mid=l+r>>1;if(check(mid)==true)即mid在左边部分,l=mid+1;if(check(mid)==false),即mid在右边部分,r=mid;

这是两种求边界值的模板。

question

具体第一种模板为什么mid+1,没仔细推过,听讲是怕出现l与r出现相邻的情况。

代码:

bool check(int x) {/* ... */} // 检查x是否满足某种性质

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

思考:

最后return l和r都可以,因为二分到最后,l==r,但是不能是mid,因为更新边界的时候,是l=mid+1或者r=mid-1;

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值