要点:应分别先寻找targrt的左右边界
右边界:遇见targret时,left = mid + 1,并存储mid为临时边界值
左边界:遇见targret时,right = mid - 1,并存储mid为临时边界值
分三种情况考虑:
-
数组中含有target ->左右边界不为默认值
- 数组中含有多个target
- 组中只含有一个target
-
数组中不含有target ->左右边界均为默认值
- 有比target大的,也有比target小的
- 全部比target大
- 全部比target小
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int Rboard = getRightBoard(nums, target);
int Lboard = gerLeftBoard(nums, target);
if( Rboard == -1 || Lboard == -1){
return {-1, -1};
}
return {Lboard, Rboard};
}
private:
int getRightBoard(vector<int>& nums, int target){
int left = 0;
int right = nums.size() - 1;
int Rboard = -1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target){
right = mid - 1;
}
else if(nums[mid] < target){
left = mid + 1;
}
else {
left = mid + 1;
Rboard = mid;
}
}
return Rboard;
}
int gerLeftBoard(vector<int>& nums, int target){
int left = 0;
int right = nums.size() - 1;
int Lboard = -1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target){
right = mid - 1;
}
else if(nums[mid] < target){
left = mid + 1;
}
else{
right = mid - 1;
Lboard = mid;
}
}
return Lboard;
}
};