题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题刚开始我是按照正常的二分查找找出一个与target相等的数组下标,然后左右移动这个下标直至target与其值不相等,但是超时了,评论区有大佬说最坏的情况(即所有的数都是target)的时间复杂度是O(n)。
这个做法我是借鉴了评论区代码随想录的思路。
我觉得这个题有两个难点,第一个是要能想到找右边界的时候 nums[mid]=target时,left还是要等于mid+1,这样才能找到第一个大于target的值,左边界同理。第二个就是要给左右边界赋一个初值(数组下标到不到的),这样才能知道左右边界是否被改变了。
在这里插入代码片
```class Solution {
public:
vector searchRange(vector& nums, int target) {
int LeftBorder=getLeftBorder(nums, target);
int RightBorder=getRightBorder(nums, target);
if(LeftBorder==-2||RightBorder==-2) //target太大或太小,超出数组范围
return {-1,-1};
if(RightBorder-LeftBorder>1) //有target值
return {LeftBorder+1,RightBorder-1};
return {-1,-1}; //没有target值
}
private:
int getRightBorder(vector& nums,int target){ //寻找右边界
int l=0;
int r=nums.size()-1;
int RightBorder=-2; //记录一下其值,可分辨出它是否被赋值了
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]>target)
r=mid-1;
else{
l=mid+1;
RightBorder=l; //右边第一个不是target的
}
}
return RightBorder;
}
int getLeftBorder(vector& nums,int target){ //寻找左边界
int l=0;
int r=nums.size()-1;
int LeftBorder=-2;
while(l<=r){
int mid=l+(r-l)/2;
if(nums[mid]
r=mid-1;
LeftBorder=r; //左边第一个不是target的
}
}
return LeftBorder;
}
};



