二分法中最痛苦的问题:确定边界条件。
下面从一个最简单的例子说起:
LeetCode 704. 二分查找
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) # 确定左右边界
while left < right: # 终止条件
mid = left + (right-left)//2 #得到中间点
if nums[mid] == target: return mid
# 收缩可行的区间
if nums[mid] < target: left = mid+1
else: right = mid
return -1
上面是二分法的标准流程:
- 确定左右边界,[left, right)
- 确定终止条件
- 获得中点
- 根据比较的值,收缩可行的区间
1、确定左右边界
一个 n n n长有序序列的最小索引是 0 0 0,最大索引是