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

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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐