1. 题目解析与核心思路
这道力扣中等难度题目要求我们在一个非递减排序的整数数组中,找到给定目标值的起始和结束位置。如果目标值不存在于数组中,需要返回[-1, -1]。题目要求算法时间复杂度必须控制在O(log n)级别,这意味着我们需要使用二分查找的变种来实现。
1.1 问题本质分析
这道题的核心在于处理有序数组中重复元素的边界定位。普通二分查找在找到目标值后会立即返回,但这里需要继续搜索直到确定元素的边界。举个例子:
- 输入数组 [5,7,7,8,8,10],目标值8
- 正确输出应该是[3,4],因为8第一次出现在索引3,最后一次出现在索引4
1.2 算法选择依据
选择二分查找的变种主要基于以下考虑:
- 有序数组的特性天然适合二分查找
- O(log n)的时间复杂度要求排除了线性扫描的可能性
- 需要分别处理左边界和右边界两种情况
- 常规二分查找无法直接解决重复元素的边界问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二分查找变种实现细节
2.1 左边界查找算法
查找左边界的二分查找需要做以下调整:
python复制def find_left(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
关键点说明:
- 当nums[mid] == target时,仍然执行right = mid - 1,继续向左搜索
- 循环结束时,left指向的就是第一个等于target的位置
- 需要检查left是否越界以及nums[left]是否确实等于target
2.2 右边界查找算法
右边界的查找逻辑稍有不同:
python复制def find_right(nums, target):
left, right = 0, len(nums) - 1
while left <= right:
