34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
示例1
输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]
示例2
输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]
代码
class Solution {
public:
int find(vector<int>& nums, int target,int low,int high){
if(target < nums[0] || target > nums[nums.size()-1]) return -1;
int mid=(low+high)/2;
while(low <= high){
if(target==nums[mid]) return mid;
else if(target<nums[mid]) high=mid-1;
else low=mid+1;
mid=(low+high)/2;
}
return -1;
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
if(nums.size()==0) return vector<int>{-1,-1};
if(find(nums,target,0,nums.size()-1)==-1){
ans.push_back(-1);
ans.push_back(-1);
}
else {
int lowindex=find(nums,target,0,nums.size()-1);
int highindex=find(nums,target,0,nums.size()-1);
while(nums[lowindex]==target){
lowindex--;
if(lowindex==-1) break;
}
while(nums[highindex]==target){
highindex++;
if(highindex==nums.size()) break;
}
ans.push_back(lowindex+1);
ans.push_back(highindex-1);
}
return ans;
}
};