题目要求
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题
测试用例:
方法一:暴力寻找(虽然可以通过,但是不满足时间复杂度为 O(log n) )
代码如下:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int right=-1;
int left=-1;
int tem=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==target){
right=i;
++tem;
}
}
if(tem==0)
return{-1,-1};
left=right-tem+1;
return {left,right};
}
};
方法二:使用二分法
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int mightright=searchright( nums, target);
int mightleft=searchleft(nums, target);
if(mightright==-2||mightleft==-2){
return{-1,-1};
}
if(mightright-1<mightleft+1){
return{-1,-1};
}
return {mightleft+1,mightright-1};
}
private:
int searchright(vector<int>& nums, int target){
int right=nums.size()-1;
int left=0;
int mightright=-2;
while(right>=left){
int middle=(left+right)/2;
if(nums[middle]<=target){
left=middle+1;
mightright=left;
}
else{
right=middle-1;
}
}
return mightright;
}
int searchleft(vector<int>& nums, int target){
int right=nums.size()-1;
int left=0;
int mightleft=-2;
while(right>=left){
int middle=(left+right)/2;
if(nums[middle]>=target){
right=middle-1;
mightleft=right;
}
else{
left=left+1;
}
}
return mightleft;
}
};