题目链接:34.在排序数组中查找元素的第一个和最后一个位置
题解:
同样是二分!
题目简述:
给定一个有序数组,找到目标值出现的开始和结束位置!
题解:
同样是二分:目的在于找到两个端点,如下图:

使用 x >= target可以找到满足该条件的最后一个数,即左端点!
使用x <= target可以找到满足该条件的最后一个数, 即右端点!
具体情况:
- 若数组为空,直接返回-1
- 若左端点不存在,即不存在
target直接返回-1
- 否则,重新二分该数组找到右端点,最后返回。
注意: 二分左端点时,r的选取可以是nums.size() - 1,也可以是上次二分的结果。复杂度不影响!
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) return {-1, -1}; int l = 0, r = nums.size() - 1; while(l < r){ int mid = l + r >> 1; if(nums[mid] >= target) r = mid; else l = mid + 1; } if(nums[r] != target) return {-1, -1}; int L = r; l = 0, r = nums.size() - 1; while(l < r){ int mid = l + r + 1 >> 1; if(nums[mid] <= target) l = mid; else r = mid - 1; } return {L, r}; } };
|