二分查找

69 阅读1分钟

二分查找算法总结:

搜索target范围,搜索旋转数组

  • 使用 left<=right 条件,上面是从左往右找,下面是从右往左找,都是定位到可以第一个insert的地方
    def searchRange(nums: List[int], target: int) -> List[int]:
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r) // 2
            if nums[mid] >= target:
                r = mid - 1  #此处可以最快收敛
            else:
                l = mid + 1
        left = l
       #上面是从左往右找,下面是从右往左找,都是定位到可以第一个insert的地方
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r + 1) // 2
            if nums[mid] <= target:
                l = mid + 1
            else:
                r = mid - 1
        right = r
        if right < 0 or nums[right] != target:
            return [-1, -1]
        return [left, right]
  • 使用 left<right 条件
  def searchRange(nums: List[int], target: int) -> List[int]:
        l, r = 0, len(nums) - 1
        while l < r:
            mid = (l + r) // 2
            if nums[mid] >= target:
                r = mid  #由于while条件没有=,所以这里不能 -1
            else:
                l = mid + 1
        left = l
       #上面是从左往右找,下面是从右往左找,都是定位到可以第一个insert的地方
        l, r = 0, len(nums) - 1
        while l < r:
            mid = (l + r + 1) // 2
            if nums[mid] <= target:
                l = mid
            else:
                r = mid - 1
        right = r
        if right < 0 or nums[right] != target:
            return [-1, -1]
        return [left, right]
  • 搜索旋转数组
    def search(nums: List[int], target: int) -> int:
        l, r = 0, len(nums) - 1
        while l <= r:
            print(l, r)
            mid = (l + r) // 2
            if nums[mid] == target:
                return mid
            if nums[mid] >= nums[l]:  # left ok
                if nums[mid] >= target and nums[l] <= target:
                    r = mid - 1
                else:
                    l = mid + 1
            else:  # right ok
                if nums[mid] <= target and nums[r] >= target:
                    l = mid + 1
                else:
                    r = mid - 1
        return -1