妈妈再也不用担心我的二分了,寻找第一个满足或者最后一个满足某一条件的值,左右区间设置为闭区间,循环条件也是l<=r,重点是用pos记录最后一次满足条件时更新的值,pos初始为-1用于不存在满足条件的元素时返回,在满足条件的语句块中更新pos并且根据要求移动左右边界,如果找最后一个,就收缩左边界,如果找第一个就收缩右边界,最后返回的pos就是满足条件的位置了。
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
res[0] = searchLeft(nums, target);
res[1] = searchRight(nums, target);
return res;
}
int searchLeft(int[] nums, int target) {
int left = 0, right = nums.length - 1, pos = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
//更新pos并收缩区间
} else if (nums[mid] == target) {
pos = mid;
right = mid - 1;
}
}
return pos;
}
int searchRight(int[] nums, int target) {
int left = 0, right = nums.length - 1, pos = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
//更新pos并收缩区间
} else if (nums[mid] == target) {
pos = mid;
left = mid + 1;
}
}
return pos;
}