Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

Example 1:

Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]

Example 2:

Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
Accepted
371,213
Submissions
1,076,399
 
 
 
class Solution {
public:
    int bs(vector<int> &n,int t)
    {
        int l=0,r=n.size()-1,m;
        while(l<=r)
        {
            m=(l+r)/2;
            if(n[m]<t)
                l=m+1;
            else
                r=m-1;
        }
        return l;
    }
    vector<int> searchRange(vector<int>& nums, int target) {
        int idx1=bs(nums,target);
        int idx2=bs(nums,target+1)-1;
        if(idx1<nums.size()&&nums[idx1]==target)
            return {idx1,idx2};
        return {-1,-1};
    }
};

 

二分查找有三个函数 ,
1 binary_search
2 lower_bound
3 upper_bound
本题用lower_bound即可解决.
这三个函数基本实现方法类似, 细微区别在于 1 需要用==来判断middle和target是否相等, 相等则返回.
2 是不判断相等,只判断 middle<target, 返回值不是middle,是left
3 同理, 只判断target<middle
 
 
 
private static int lowerBound(int[] a, int low, int high, int element){
    while(low < high){
        int middle = low + (high - low)/2;
        if(element > a[middle])
            low = middle + 1;
        else 
            high = middle;
    }
    return low;
}


private static int upperBound(int[] a, int low, int high, int element){
    while(low < high){
        int middle = low + (high - low)/2;
        if(a[middle] > element)
            high = middle;
        else 
            low = middle + 1;
    }
    return low;
}