coding notesleetcode_problem-Binary_Search
Tony Cao常见的二分查找的方法
1. 二分查找昌需要确定target和middle的相对位置(如图):
常见的方式是使用左闭右开的区间,符合python中数据的定义格式
lower_bound 返回最小的满足 nums[i] >= target 的 i
如果数组为空,或者所有数都 < target,则返回 len(nums)
要求 nums 是非递减,即 nums[i] <= nums[i + 1]
- 左闭右开区间写法(常用的写法,一般python中的range()函数也是左闭右开区间,应该使用统一的标准)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| def lower_bound2(nums: List[int], target: int) -> int: left = 0 right = len(nums) while left < right: mid = (left + right) // 2 if nums[mid] < target: left = mid + 1 elif nums[mid] > target: right = mid elif nums[mid] == target: return mid elif nums[mid] == target: right = mid elif nums[mid] == target: left = mid + 1 return left
|
- 闭区间写法
1 2 3 4 5 6 7 8 9 10 11 12
| def lower_bound(nums: List[int], target: int) -> int: left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] < target: left = mid + 1 else: right = mid - 1 return left
|
- 开区间写法
1 2 3 4 5 6 7 8 9 10 11 12
| def lower_bound3(nums: List[int], target: int) -> int: left, right = -1, len(nums) while left + 1 < right: mid = (left + right) // 2 if nums[mid] < target: left = mid else: right = mid return right
|
2. 最终的开闭区间写法总结如下表:
可以使用开闭区间开判断left和right的收缩范围
[up主专用,视频内嵌代码贴在这]