Python:二分查找模板

update:果然是思而不学则殆,今天了解到sortedcontainers.SortedList就可以满足绝大部分二分查找的需求。

Python的二分查找library只有针对indexable的bisect,这东西很不通用。在functools日益强大的趋势下,Python没有个好用的二分查找库函数也是离谱。于是我们只好自己写一个。

from typing import Callable

def binary_search(cond: Callable[[int], bool], l: int, r: int) -> int:
    """ search m within [l:r] that [l:m] satisfies cond but [m:r] not
    """
    while l < r:
        m = (l+r) // 2
        if cond(m):
            l = m + 1
        else:
            r = m
    return l

平时可以复制粘贴使用简洁版:

def binary_search(cond, l, r):
    """ search m within [l:r] that [l:m] satisfies cond but [m:r] not
    """
    while l < r:
        m = (l+r) // 2
        if cond(m): l = m + 1
        else: r = m
    return l

用法:

nums = [0,1,2,3,4]
target = 2
binary_search(lambda i: nums[i]<=target, 0, len(nums)) # returns: 3
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值