题目
- 给你一个按照非递减顺序排列的整数数组
n
u
m
s
nums
nums,和一个目标值
t
a
r
g
e
t
target
target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 t a r g e t target target,返回 [ − 1 , − 1 ] [-1, -1] [−1,−1]。 - 你必须设计并实现时间复杂度为 O ( l o g N ) O(log N) O(logN) 的算法解决此问题。
关键点
- O ( l o g N ) O(log N) O(logN) 复杂度
思路
- 对数复杂度表面要用二分查找
- 使用两次二分查找分别找到开始和结束位置
代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
// int n = nums.size();
// int pl=0, pr=n-1;
// while(pl <= pr){
// int mid = (pl+pr)/2;
// if(nums[mid] == target){
// int l = mid, r = mid;
// if(l > 0){
// while(nums[l-1] == target){
// l--;
// if(l==0)
// break;
// }
// }
// if(r < n - 1){
// while(nums[r+1] == target){
// r++;
// if(r==n-1)
// break;
// }
// }
// return {l,r};
// }
// else if(nums[mid] > target){
// pr = mid-1;
// }
// else{
// pl = mid+1;
// }
// }
// return {-1,-1};
int n = nums.size();
int pl = 0, pr = n - 1;
int l = -1, r = -1;
// 第一次找左边界
while(pl <= pr){
int mid = (pl + pr) / 2;
if(nums[mid] == target){
l = mid;
// 左边界一定小于等于mid
pr = mid - 1;
}
else if(nums[mid] > target){
pr = mid - 1;
}
else{
pl = mid + 1;
}
}
pl = 0; pr = n - 1;
// 第二次找右边界
while(pl <= pr){
int mid = (pl + pr) / 2;
if(nums[mid] == target){
r = mid;
// 右边界一定大于等于mid
pl = mid + 1;
}
else if(nums[mid] > target){
pr = mid - 1;
}
else{
pl = mid + 1;
}
}
return {l, r};
}
};