思路:先二分找到第一次出现的位置,第二遍二分找到最后一次出现的位置.
和这道题的解法一样:二分法+边界处理:学会避免死循环很好的一道题
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int lens=nums.size()-1;
int l=0,r=lens;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]<target) l=mid+1;//这里我们找到比目标值小的值的上一个下标
else r=mid;
}
vector<int> v;
if(r<0||nums[l]!=target){//r<0是为了防止nums为空的情况
v.push_back(-1);
v.push_back(-1);
}else{
v.push_back(l);
r=lens;
while(l<r){
int mid=(l+r+1)/2;
if(nums[mid]<=target) l=mid;//这里一定是"<="
else r=mid-1;
}
v.push_back(l);
}
return v;
}
};