算法基础 - 二分

本文介绍了整数和浮点数二分搜索的基本原理,包括两种模板(右侧符合答案和左侧符合答案),以及为何在整数二分中需要l+r+1避免死循环。作者通过实例说明了如何在升序数组中使用这些方法来找到特定条件的元素下标。
摘要由CSDN通过智能技术生成

算法基础 - 二分

二分的本质是解决在某一个区间中,存在一个性质可以将区间一分为二,便可以使用二分找到符合该性质的点。

整数二分

在整数二分中,分为二个模板。

当答案唯一时,二个模板,没有任何区别。

  • 右侧符合答案
bool check(int x) {  } // 检查 x 是否满足二分性质

// 右侧符合答案
int bsearchR(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check()) r = mid;
        // 注意:当 check() 成功后,变换规则: r = mid 时,mid = l + r + 1 >> 1
        else l = mid + 1;
    }

    return l;
}

例
给定一个升序数组如:[1, 3, 5, 5, 7, 9]
需要找到符合大于等于 5 的下标
那么使用该模板,找到的下标为 2
  • 左侧符合答案
bool check(int x) {  } // 检查 x 是否满足二分性质

// 左侧符合答案
int bsearchL(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check()) l = mid;
        // 注意:当 check() 成功后,变换规则: l = mid 时,mid = l + r + 1 >> 1
        else r = mid - 1;
    }
    
    return l;
}

例
给定一个升序数组如:[1, 3, 5, 5, 7, 9]
需要找到符合小于等于 5 的下标
那么使用该模板,找到的下标为 3

为什么第二个模板需要 l + r + 1 。

因为整数除法是向下取整,当 mid = (l + r) / 2,l = mid ,如果 l = 0 ,r = 1 时,由于向下取整, mid = 0 ,l = mid = 0 ,那么就陷入的死循环。

浮点数二分

浮点数二分,不存在整数除法的向下取整,所以不存在整数二分的情况。

bool check(double x) { ... } // 检查 x 是否满足二分性质

double bsearch(double l, double r)
{
    while (r - l >= 1e-6)  // 当 r - l 小于某一个很小的值后,认为 r/l 相等。
    {
        double mid = (l + r) / 2;
        if (check()) r = mid;
        else l = mid;
    }
    return l;
}
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初原挽风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值