二分法查找 左闭右开,划分区间

二分查找 upper_bound_

在这里插入图片描述
清华邓公里面有这个二分查找思路:
区间[lo,hi) 表示待定区域,[0,lo),表示绝对小于value的区域, [mi,hi),表示大于等于value的区域
最后得到的lo 的语意刚好满足,只不过本题给出的答案要加一,表示的不是秩,而是位置。

#
# 二分查找
# @param n int整型 数组长度
# @param v int整型 查找值
# @param a int整型一维数组 有序数组
# @return int整型
#
class Solution:
    def upper_bound_(self , n , v , a ):
        # write code here
        lo = 0
        hi = len(a)
        while lo < hi:
            mi = (lo + hi) // 2
            if a[mi] < v:
                lo = lo+1
            else:
                hi = mi
        return lo+1

第一题在这里插入图片描述

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        lo = 0
        hi = len(nums)
        while lo < hi:
            mi = (lo + hi) // 2
            if mi == nums[mi]:
                lo = mi +1
            else:
                hi = mi
        return lo
左闭右开的解法
[lo,hi) 表示待定的区间
[0,lo):表示等于的区间
[hi, len(nums) ) : 表示不等于的区间

最后返回的lo->hi, 表示一个以lo的左侧的分界线,左侧都等于,右边都不等于
写代码时,以划分区间为起点,怎样的条件可以正确的划分区间。

第二题

在这里插入图片描述

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        # 绝对小于 target
        lo = 0
        hi = len(nums)
        while lo < hi:
            mid = (lo + hi) // 2
            if nums[mid] < target:
                lo = mid+1
            else:
                hi = mid
        x1 = lo
        # 绝对大于target
        lo = 0
        hi = len(nums)
        while lo < hi:
            mid = (lo + hi) // 2
            if target < nums[mid]:
                hi = mid
            else:
                lo = mid + 1
        x2 = lo -1
        return x2-x1+1

用划分区间的方法,使用二分法,划分两次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值