二分 查找


#在递增数组中找大于等于x的第一个位置,从前向后看
def seekdadeng(nums,x):
    left=0
    right=len(nums)-1
    while left<=right:
        mid=(left+right)//2
        if nums[mid]>=x: #右边部分都是大于等于x的部分
            right=mid-1
        else: #左边部分都是小于x的部分
            left=mid+1
    else:
        return left
    #while循环结束条件是left>right,即right+1=left
    #循环不变量 nums[left-1]<x nums[right+1]>=x
    #nums[left]=nums[right+1]>=x
    #|1|2|3|5|8|8|9|
    #       | |
    #   right |
    #        left


#在递增数组中找大于x的第一个位置,从前向后看
#大于等于x时nums[mid]>=x 大于x时nums[mid]>x or 大于x就是大于等于x+1
def seekda(nums,x):
    left=0
    right=len(nums)-1
    while left<=right:
        mid=(left+right)//2
        if nums[mid]>=x+1: #大于x就是大于等于x+1
            right=mid-1
        else:
            left=mid+1
    else:
        return left

def seekda(nums,x):
    left=0
    right=len(nums)-1
    while left<=right:
        mid=(left+right)//2
        if nums[mid]>x: #右边部分都是大于x的部分
            right=mid-1
        else: #左边部分都是小于等于x的部分
            left=mid+1
    else:
        return left

#在递增数组中找小于x的第一个位置,是从后向前看的
#在递增数组中找小于x的最后一个位置,从先向后看
def seekxiao(nums,x):
    left=0
    right=len(nums)-1
    while left<=right:
        mid=(left+right)//2
        if nums[mid]>=x: #小于x就是大于等于x的第一个位置的左边一位
            right=mid-1
        else:
            left=mid+1
    else:
        return right # right就在left的左边一位

#在递增数组中找小于等于x的第一个位置,从后向前
#在递增数组中找小于等于x的最后一个位置,从前向后
def seekxiaodeng(nums,x):
    left=0
    right=len(nums)-1
    while left<=right:
        mid=(left+right)//2
        if nums[mid]>=x+1: #小于等于x就是大于x的第一个位置的左边那个数,大于x又是大于等于x+1
            right=mid-1
        else:
            left=mid+1
    else:
        return right #right在left的左边

#如果找大于x时,全是比x小的,那么left==len(nums)
#如果找小于x是,全是比x大的,那么right=len(nums)


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值