二分法-python-左右边界问题的阐述

##第一种边界:左右闭区间:

def dichotomyOne(nums,target):
    #左右闭区间 终止条件为left  = right + 1 [right,right+1]
    # (即我们所找的对应的值没有大于这个并且小于后一个的中间值,因此为None)
    #寻找一个数字
    left = 0
    right = len(nums)-1
    while left <=right :
        mid = (left + right)//2
        if nums[mid]==target :
            return mid
        elif nums[mid]<target :
            left = mid + 1
        else:
            right = mid - 1
    return None
#此算法的局限性比如给定一个列表[1,5,5,5,8]
#此时target = 5时,只能返回对应索引2,但是对于索引1和3是无法进行操作的
#我们一般不会进行找到中间索引后,再进行左右的线性查找,这样不能确保时间复杂度

##第二种边界:左开右闭区间:

def  dichotomyTwo(nums,target):
    #左闭右开区间 终止条件为[left,left)一定满足循环的退出条件
    #寻找左边界
    left = 0
    right = len(nums)#这里对应的开区间
    while left < right :
        mid = (left + right)//2
        if nums[mid] == target :
            right = mid#[left,mid)
        elif nums[mid] > target :
            right = mid#[left,mid)
        else:
            left = mid + 1#[mid+1,right)
    return left
    #right也可以,此时的终止条件为right = left
#此方法的函数返回值对应的left变量的返回值即对应的取值为[0,len(nums)]的
#对应的函数的含义为小于target的值有多少个
#找到最左侧边界,通过不断压缩right
def  dichotomyThree(nums,target):
    #寻找右边界
    #同样是左闭右开的区间
    left = 0
    right = len(nums)
    while left < right :
        mid = (left + right)//2
        if nums[mid] == target :
            left = mid + 1#[mid+1,right)
        elif nums[mid] < target:
            left = mid + 1#[mid+1,right)
        else:
            right = mid#[left,mid)
    return right-1
#主要作用便是找到最右侧边界,通过不断压缩最左侧边界

##第三种区间:左右开区间:

def  dichotomyFour(nums,target):
    #左右开区间的写法
    #开区间的找左边界方法
    left = -1
    right = len(nums)
    while left + 1 < right:  # 区间不为空
        mid = (left + right) // 2
        if nums[mid] < target:
            left = mid  # 范围缩小到 (mid,right)
        elif nums[mid] > target:
            right = mid  # 范围缩小到 (left,mid)
        else:
            right = mid #范围缩小到(left,mid)
    return right  # 或者 left+1

总结:

1.左右闭区间-单个适用于查找某一个数组或者具有维度的矩阵,列表中进行找对应的数字

2.左开右闭区间

        2.1查找左边界-当中间索引号的具体数值与目标值相对应的时候继续向左压缩区间

        具体用处:找到比最左侧某一个值小(|2|右)左侧所有个数和

        2.2查找右边界-当中间索引号的具体数值与目标值相对应的时候继续向右压缩区间

        具体用处:找到比最右侧某一个值小(左|2|)左侧所有个数和

3.左右开区间-同左闭右开区间一样,返回值有所变化 return = left + 1 / right

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值