经典的二分查找题目,以前刷题的时候知道一个小技巧,计算mid的时候不是相加除以2,而是l + (r-l)/2这样可以避免l+r溢出,还有针对数组{1,2,2,2,3,4,5}这种,查询最左边的2或者最右边的2.AC的解法参考了评论区大神代码,自己实现了stl里的lower_bound,用于查找第一个不小于给定元素的位置。如果存在相同元素当然命中的是最左边的元素。AC解法巧妙的使用lower_bound来实现upper_bound.
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int l = lower_bound(nums,target);
int r = lower_bound(nums,target + 1) -1;
if(l < nums.size() && nums[l] == target)
{
return {l,r};
} else {
return {-1,-1};
}
}
private:
int lower_bound(vector<int>& nums, int target) {
int l = 0,r = nums.size() - 1;
while(l <= r){
int mid = l + (r -l) / 2;
if(nums[mid] < target)
l = mid + 1;
else
r = mid - 1;
}
return l;
}
};