1.解题思路
采用二分法来去寻找左右边界
2.代码(c++)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int rightBorder=getRightBorder(nums,target);
int leftBorder=getLeftBorder(nums,target);
// 情况一
if (leftBorder == -2 || rightBorder == -2) return {-1, -1};
// 情况三
if (rightBorder - leftBorder > 1) return {leftBorder + 1, rightBorder - 1};
// 情况二
return {-1, -1};
}
private:
int getRightBorder(vector<int>& nums, int target) {//找右边界
int left=0;
int right=nums.size()-1;
int rightborder=-2;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>target){//不能等于目标值,等于情况下要让left继续往右移动找到最后位置
right=mid-1;
}else{
left=mid+1;
rightborder=left;
}
}
return rightborder;
}
int getLeftBorder(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int leftborder=-2;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]>=target){//需要等于目标值,等于情况下要让rihght继续往左移动找到第一个位置
right=mid-1;
leftborder=right;
}else{
left=mid+1;
}
}
return leftborder;
}
};
3.反思
①寻找右边界时,为什么nums[mid]不能等于target?
答:因为找右边界时,left需要一直往后移动,直到left大于right碰到最后右边界,所以nums[mid]等于target时,应该让left移动抵达最右边界。
②寻找左边界时,为什么nums[mid]大于等于target?
答:大于好理解,当nums[mid]=target时,right还需要往左移动,直到不动为止,这样抵达左边界。
③最后返回为什么leftBorder + 1, rightBorder - 1?
答:leftBorder和rightBorder都是边界但最后输出需要位置,所以左边界加一,右边界减一。