1.题目分析
1.很典型的二分查找,二分查找的主要是要找到一种策略,舍弃掉另一半不可能的数据。
2.在本题中出现了一种情况,eg: low = 1, high = 2, mid = 1; 而且 nums[low] = nums[high] = target; 在寻找上界的时候,由于mid可能会是上界,所以只能令low = mid; 结果陷入死循环; 技巧,令 mid = (low + high) / 2 + 1;
2.示例代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.empty()){
return {-1, -1};
}
//分别找到上界与下界
int low = 0, high = nums.size() - 1;
int lower_bound;
while(low < high){//end with low == high
int mid = (low + high) / 2;
if(nums[mid] >= target){
high = mid;
}else{
low = mid + 1;
}
}
if(nums[low] == target){
lower_bound = low;
}else{
return {-1, -1};
}
low = 0, high = nums.size() - 1;
int upper_bound;
while(low < high){
int mid = (low + high) / 2 + 1;
if(nums[mid] > target){
high = mid - 1;
}else{
low = mid;
}
}
upper_bound = low;
return {lower_bound, upper_bound};
}
};