题目描述
给定非递减排序的整数数组 nums 和目标值 target,需找到 target 在数组中的第一个位置和最后一个位置;若不存在则返回 [-1, -1],要求时间复杂度为 O(log n)。
核心要求:依托排序数组特性,用二分查找高效定位边界,拒绝线性遍历。
核心思路:用'找第一个≥目标值'的二分模板统一边界逻辑
二分查找的核心是在有序序列中定位满足条件的第一个位置。我们只需实现一个通用二分模板 ——查找数组中第一个大于等于目标值的索引(方法名统一为 binarySearch),即可统一解决本题的两个边界问题:
第一个位置:直接调用
binarySearch查找target,得到第一个≥target的索引;若索引越界或对应值不等于target,说明target不存在。 最后一个位置:等价于调用binarySearch查找第一个**≥target+1** 的索引,再将结果减 1。原因是:非递减数组中,target+1的首个出现位置的前一位,就是target的最后一次出现位置。
上述最后一个位置的转化可以参考以下表格:
| 你想找的 | 等价问题(转换思路) | 调用 binarySearch | 返回的 idx 含义 | 最终答案(位置或值) | 举例 (nums=[1,3,3,5,7]) |
|---|---|---|---|---|---|
第一个 >= x | 原问题 | binarySearch(nums, x) | 第一个 >= x 的位置 | idx(若越界则无解) | x=3 → idx=1(值 3) |
第一个 > x | 第一个 >= (x+1) | binarySearch(nums, x+1) | 第一个 >= x+1 的位置 | idx(若越界则无解) | x=3 → idx=3(值 5) |
最后一个 < x | 第一个 >= x 的左边 | binarySearch(nums, x) | 第一个 >= x 的位置 | idx - 1(若 idx=0 则无解) | x=3 → idx=1,答案 0(值 1) |
最后一个 <= x | 第一个 > x 的左边 或 第一个 >= x+1 的左边 | binarySearch(nums, x+1) | 第一个 > x 的位置 | idx - 1(若 idx=0 则无解) |


