设想:我想在 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))