给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0 输出:[-1,-1]
解题思路:可以将此过程分成两个二分法,第一个二分法先查找第一个target对应的第一个下标(最左边) 第二个二分法找target对应的最后一个下标:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
//二分法 分两次查找
int left =0;
int right =nums.size()-1;
int first = -1;
int last = -1;
//第一次先找第一个target的下标
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]==target){
first = mid;
right = mid-1; //这里很关键 第一个要向左边找边界 所以右界要-1
}
else if(nums[mid]>target){
right = mid -1;
}
else{
left = mid +1;
}
}
//第二遍找最后一个target的下标
int left1 =0;
int right1 =nums.size()-1;
while(left1<=right1){
int mid = (left1+right1)/2;
if(nums[mid]==target){
last =mid;
left1 =mid + 1; //同理左界 -1
}
else if(nums[mid]>target){
right1 = mid -1;
}
else{
left1 = mid +1;
}
}
return vector<int>{first, last};
}
};
4128

被折叠的 条评论
为什么被折叠?



