思路先确定是否存在目标数字,在目标数字的左端寻找最小位置,在目标数字的最右端寻找最大位置,通过二分查找,时间复杂度限定在O(logn)
class Solution {
vector<int> searchRange(vector<int>& nums, int target) {
int len = nums.size();
vector<int> ans;
int firstindex = findFirstindex(nums,target);
if(firstindex==-1){
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
int minindex = getMinindex(nums,0,firstindex-1,target);
int maxindex = getMaxindex(nums,firstindex+1,len-1,target);
if(minindex==-1&&maxindex==-1){
ans.push_back(firstindex);
ans.push_back(firstindex);
}
else if(minindex==-1&&maxindex!=-1){
ans.push_back(firstindex);
ans.push_back(maxindex);
}
else if(minindex!=-1&&maxindex==-1){
ans.push_back(minindex);
ans.push_back(firstindex);
}
else{
ans.push_back(minindex);
ans.push_back(maxindex);
}
return ans;
}
private:
int findFirstindex(vector<int>& nums,int target){
int i =0;
int j = nums.size()-1;
int index;
while(i<=j){
index = (i+j)/2;
if(nums[index]==target){
return index;
}
else if(nums[index]<target){
i = index+1;
}
else{
j = index-1;
}
}
return -1; //无此元素
}
int getMinindex(vector<int>& nums,int start,int end,int target){
if(nums[end]<target||end<start){
return -1;
}
while(nums[start]!=nums[end]){
int index = (start+end)/2;
if(nums[index]<target&&index+1<end){
start = index;
}
else if(nums[index]<target&&index+1==end){
start = index+1;
}
else{
if(index-1>start){
end = index;
}
else{
return nums[index]==nums[start]?start:index;
}
}
}
if(nums[start]==target)
return start;
return -1;
}
int getMaxindex(vector<int>& nums,int start,int end,int target){
if(nums[start]>target||start>end){
return -1; //-1代表右端没有相同的值,如果不进入该if,左端start元素必定为target
}
while(nums[end]!=nums[start]){
int index = (start+end)/2;
if(nums[index]>target&&index-1>start){
end = index;
}
else if(nums[index]>target&&index-1==start){
end = index-1;
}
else{
if(index+1<end){
start = index;
}
else{
return nums[index]==nums[end]?end:index;
}
}
}
if(nums[end]==target)
return end;
return -1;
}
};