经典的二分查找题目,以前刷题的时候知道一个小技巧,计算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;
    }
};