class Solution {
// 时间复杂度O(log n) 空间复杂度O(1) 常量空间存放变量
// 二分法
// 寻找第一次target的位置,更新右边界
// 最后一次target的位置,更新左边界
public int[] searchRange(int[] nums, int target) {
int firstPos = findBoundary(nums, target, true);
if (firstPos == -1) {return new int[]{-1, -1};}
int lastPos = findBoundary(nums, target, false);
return new int[]{firstPos, lastPos};
}
public int findBoundary(int[] nums, int target, boolean first) {
int left = 0, right = nums.length - 1;
int pos = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else { // nums[mid] == target
pos = mid;
if (first) {
right = mid - 1; // 寻找第一次出现target的位置,向左移动右边界
} else {
left = mid + 1; // 寻找最后一次出现target的位置,向右移动左边界
}
}
}
return pos;
}
}