二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素

1. 不小于某数的第一个元素

def bisearch(l, e, lo, hi):
    while lo < hi:
        mi = (lo + hi)//2
        if e > l[mi]: lo = mi + 1
        else: hi = mi
    return hi

注:

  • (1)不同于寻找等于某值的情况(且找到即可,不要求第一个),体现在代码中,就是判断逻辑;

2. 不大于某数的最后一个元素

def binsearch(l, e, lo, hi):
    while lo < hi-1:
        mi = (lo + hi)//2
        if e >= l[mi]: lo = mi
        else: hi = mi
    return lo

注:另外的两种情况,

  • 1) 不大于某数的第一个元素 ⇒ 既然有序,左端遍历即可;
  • 2) 不小于某数的最后一个元素 ⇒ 既然有序,从尾端开始遍历即可;

没有实质的意义。

3. 传统的二分支和三分支的版本(判等)

# 三分支
def binsearch(l, e, lo, hi):
    while lo < hi:
        mi = (lo + hi)//2
        if l[mi] > e: hi = mi
        elif: l[mi] < e: lo = mi + 1
        else: return mi
    return lo if A[lo] == e else -1

# 二分支
def binsearch(l, e, lo, hi):
    while lo < hi - 1:
        mi = (lo + hi)/2
        if e < l[mi]: hi = mi
        else: lo = mi
    return lo if A[lo] == e else -1

请注意,以上的两个版本(三分支和二分支):

  • 三分支:直接返回居中的符合条件的即可,不考虑相对顺序
  • 二分支:其实返回的是最后一个等于某值元素
l = [4, 4, 4, 4, 4]
binsearch(l, 4, 0, 5)
            # 对于三分支而言,返回的是 2
            # 对于二分支而言,返回的是 4

4. 返回值等于某值的第一个元素(最后一个元素)

4.1 值等于某值的第一个元素

其实可以泛化地理解为值不小于某值的第一个元素,也就是本文开篇的第一个代码段:

def binsearch(l, e, lo, hi):
    while lo < hi:
        mi = (lo + hi)//2
        if e > l[mi]: lo = mi + 1
        else: hi = mi
    return hi

4.2 值等于某值的最后一个元素

其实就是 Part3 中的二分支版本;
也即:

def binsearch(l, e, lo, hi):
    while lo < hi:
        mi = (lo + hi)//2
        if e < l[mi]: hi = mi
        else: lo = mi
    return lo
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五道口纳什

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

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

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

打赏作者

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

抵扣说明:

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

余额充值