方法の一つ:二分法
二つの二分法
class Solution {
private:
int first(vector<int>& nums, int target){ //寻找起始位置
int left=0,right=nums.size()-1;
while(left<right){
int mid=(left+right)>>1;
if(nums[mid]<target) //[mid + 1, right]
left=mid+1;
else
right=mid;
}
if(nums[left]==target)
return left;
return -1;
}
int last(vector<int>& nums, int target){ //寻找结束位置
int left=0,right=nums.size()-1;
while(left<right){
int mid=(left+right+1)>>1;
if(nums[mid]>target) //[left,mid-1]
right=mid-1;
else
left=mid;
}
return left;
}
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty())
return {-1,-1};
int l=first(nums,target);
if(l==-1)
return {-1,-1};
int r=last(nums,target);
return {l,r};
}
};