魔改二分法
首先明确我们的查找目标:直接找第一个target和最后一个target
直接看下面的注释即可
class Solution {
public int[] searchRange(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
/*
* nums如果是空的,下面while直接越界,
* 因此不需健壮性判断
*/
int first = -1;
int second = -1;
while (left <= right) {
int mid = (left + right) / 2;
/*
* 找到了某一个target,但是我们需要找的是
* 第一个target,先保存mid下来,再往左寻找。
* 如果找到的是第一个target,while最终会越界,
* 无需担心mid会丢失
*/
if (nums[mid] == target) {
first = mid;
right = mid - 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
left = 0;
right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
/*
* 找到了某一个target,但是我们需要找的是
* 最后一个target,先保存mid下来,再往右寻找。
* 如果找到最后一个target,while最终会越界,
* 无需担心mid会丢失
*/
if (nums[mid] == target) {
second = mid;
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return new int[] { first, second };
}
}