当target存在且重复时, int mid = l + (r - l) /2 找到的是最左边的target,一定要左+1,保留右
⚠️target不存在时,找到的是小于target的第一个元素
图示
当target存在且重复时, int mid = l + (r - l + 1) /2 找到的是最右边的target,一定要右-1,保留左
⚠️target不存在时,找到的是大于target的第一个元素
力扣 二分查找重复元素的最左和最右
class Solution {
public int[] searchRange(int[] nums, int target) {
if(nums.length == 0) return new int[]{-1,-1};
int l = 0,r = nums.length-1;
int right = -1,left = -1;
while(l < r){
int mid = l + (r-l) / 2;
if(nums[mid] < target){
l = mid+1;
}else r = mid;
}
left = nums[l] == target ? l : -1;
l = 0;r = nums.length-1;
while(l < r){
int mid = l + (r-l + 1) / 2;
if(nums[mid] <= target){
l = mid;
}else r = mid - 1;
}
right = nums[l] == target ? r : -1;
return new int[]{left,right};
}
}