python实现二分查找与二分答案

设想:我想在 1~10 之间找一个整数,满足某某条件。

这时由于数据很少,我可以遍历1~10,那如果我是在 1~ 10^8 呢?又或者是我想要找一个三位小数呢,这时候如果还挨个遍历可能需要好几秒甚至几十秒,那么遍历就不合适了,这时候就需要用二分来找这个数。

二分查找与二分答案都简称二分。

什么是二分?

二分就是通过一步步限制取值空间从而不断逼近想要的答案,它的好处就是可以节省时间。

         试解决这个问题:我有n把雨伞,每把雨伞能撑出的大小也不一样,举着的重量也不一样(正比),我现在有m个人,想找一把最合适的伞,既能帮我们都挡雨,又是能挡雨的雨伞中最轻的。

       我把雨伞按重量从小往大排,最小的用 L 标记,最大的用 R 标记,取其中间值 mid=(L+R)/2,判断 mid 是否可以挡雨,如果mid可以挡雨,那么 最小的用 L 标记,但最大的用 mid 标记;如果mid不可以挡雨,那么 最小的用 mid 标记,最大的用 R 标记。

 假如黄色部分是最优解,灰色为符合条件的部分,那么我的新的上限R就变成了mid

mid还是符合条件

那么还是把新的上限R变成mid

这一次的mid不再符合条件,那么把下限L变成mid

 以此类推,最终能通过上下限卡住最优解(不同的条件对应的最优解不一定是最后的上限还是下限)

# 1、把所有的可能值放在一个列表里,L mid R 分别为下标
# 2、直接调用第一个函数的时候 代入 L mid R
def erfen(l,mid,r):
    if r-l == 1:     # 已经逼近了
        return mid
    if mid >= 12:    # 判断条件是否满足
        r = mid
        mid = int((l+r)/2)
    else:
        l = mid
        mid = int((l+r)/2)
    return erfen(l,mid,r)

print(erfen(1, 15, 29))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

在北京挖石油的日子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值