1. 题目解析与核心思路
这道力扣经典题目要求我们在一个非递减顺序排列的整数数组中,找到给定目标值的开始和结束位置。如果目标值不存在于数组中,需要返回[-1, -1]。题目要求算法时间复杂度必须是O(log n)级别,这意味着我们需要使用二分查找的变种来实现。
1.1 问题本质分析
这道题看似简单,实则考察了几个关键点:
- 对二分查找算法的深入理解
- 处理重复元素的边界条件
- 在O(log n)时间复杂度内完成查找
在实际工程中,这种查找场景非常常见。比如在日志系统中查找特定时间范围的数据,或者在用户行为记录中查找某个操作的起止位置。
1.2 二分查找的变种应用
常规二分查找在找到目标值后就返回,但本题需要找到目标值的边界。我们需要实现两种变种:
- 查找左边界:即使找到目标值,仍然继续向左搜索
- 查找右边界:即使找到目标值,仍然继续向右搜索
这种变种算法在工程实践中被称为"二分查找的边界版本",是每个合格开发者都应该掌握的技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法实现详解
2.1 查找左边界的实现
查找左边界的核心在于,当nums[mid] == target时,我们不立即返回,而是继续向左搜索:
python复制def find_left_bound(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指向的可能是目标值的第一个位置
- 需要检查left是否越界以及nums[left]是否确实等于target
2.2 查找右边界的实现
查找右边界的逻辑与左边界类似,但方向相反:
python复制def find_right
