当target存在且重复时, int mid = l + (r - l) /2 找到的是最左边的target,一定要左+1,保留右
    ⚠️target不存在时,找到的是小于target的第一个元素
    图示
    二分算法整理 - 图1
    当target存在且重复时, int mid = l + (r - l + 1) /2 找到的是最右边的target,一定要右-1,保留左
    ⚠️target不存在时,找到的是大于target的第一个元素
    力扣 二分查找重复元素的最左和最右

    1. class Solution {
    2. public int[] searchRange(int[] nums, int target) {
    3. if(nums.length == 0) return new int[]{-1,-1};
    4. int l = 0,r = nums.length-1;
    5. int right = -1,left = -1;
    6. while(l < r){
    7. int mid = l + (r-l) / 2;
    8. if(nums[mid] < target){
    9. l = mid+1;
    10. }else r = mid;
    11. }
    12. left = nums[l] == target ? l : -1;
    13. l = 0;r = nums.length-1;
    14. while(l < r){
    15. int mid = l + (r-l + 1) / 2;
    16. if(nums[mid] <= target){
    17. l = mid;
    18. }else r = mid - 1;
    19. }
    20. right = nums[l] == target ? r : -1;
    21. return new int[]{left,right};
    22. }
    23. }