初始化指针和开始位置 left、right、start。在 left <= right 的条件下循环:
计算中间索引 mid,避免整数溢出(mid = left + (right - left) / 2)。
若中间元素等于目标值,记录当前位置并继续向左半部分搜索。
若中间元素小于目标值,说明目标值在右半部分,更新 left = mid + 1。
若中间元素大于目标值,说明目标值在左半部分,更新 right = mid - 1。
右边界查找:
初始化指针和结束位置 left、right、end。在 left <= right 的条件下循环:
计算中间索引 mid,避免整数溢出(mid = left + (right - left) / 2)。
若中间元素等于目标值,记录当前位置并继续向右半部分搜索。
若中间元素小于目标值,说明目标值在右半部分,更新 left = mid + 1。
若中间元素大于目标值,说明目标值在左半部分,更新 right = mid - 1。
Java代码:
java复制代码
class Solution {
public int[] searchRange(int[] nums, int target) {
int start = binarySearchLeft(nums, target);
if (start == -1) return new int[]{-1, -1};
int end = binarySearchRight(nums, target);
return new int[]{start, end};
}
private int binarySearchLeft(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int start = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
start = mid;
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return start;
}
private int binarySearchRight(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int end = -1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
end = mid;
left = mid + 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return end;
}
}