思路:经典中的经典,二分问题,采用左开右闭的区间。当我们要找左边第一个等于target的元素我们应该去用mid更新r边界,而右边应该去用mid更新l边界。
注意点1:当更新r区间是不包括r坐标(左闭右开),更新l区间是包括l坐标。
注意点2:当没找到的时候,需要注意返回的坐标判断if的时候在[0,nums.size()-1]的范围内防止越界。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
return {getLeft(nums,target),getRight(nums,target)};
}
int getLeft(vector<int>&nums,int target){
if(!nums.size())return -1;
//左开右闭
int l = 0;
int r = nums.size();
while(l<r){
int mid = (l+r)/2;
if(nums[mid]==target){
r = mid;
}
else if(nums[mid]<target){
l = mid+1;
}
else if(nums[mid]>target){
r = mid;
}
}
if(r>=0&&r<nums.size()&&nums[r]==target)return r;
return -1;
}
int getRight(vector<int>&nums,int target){
if(!nums.size())return -1;
int l = 0;
int r = nums.size();
while(l<r){
int mid = (l+r)/2;
if(nums[mid]==target){
l = mid + 1;
}
else if(nums[mid]<target){
l = mid+1;
}
else if(nums[mid]>target){
r = mid;
}
}
if(l-1<nums.size()&&l-1>=0&&nums[l-1]==target)return l-1;
return -1;
}
};