说明
-
查找起始位置:
- 当
nums[mid] == target
时,检查是否为起始位置(mid == 0
或nums[mid - 1] != target
)。 - 如果不是,将
high
移动到mid - 1
。
- 当
-
查找结束位置:
- 当
nums[mid] == target
时,检查是否为结束位置(mid == count($nums) - 1
或nums[mid + 1] != target
)。 - 如果不是,将
low
移动到mid + 1
。
- 当
-
未找到目标值:
- 如果两次二分查找都返回
-1
,说明数组中不存在目标值。
- 如果两次二分查找都返回
function searchRange($nums, $target) {
// 如果数组为空,直接返回 [-1, -1]
if (empty($nums)) {
return [-1, -1];
}
// 查找目标值的开始和结束位置
$start = binarySearch($nums, $target, true); // 查找开始位置
if ($start == -1) {
return [-1, -1]; // 目标值不存在
}
$end = binarySearch($nums, $target, false); // 查找结束位置
return [$start, $end];
}
// 辅助函数:二分查找
function binarySearch($nums, $target, $findStart) {
$low = 0;
$high = count($nums) - 1;
$result = -1;
while ($low <= $high) {
$mid = (int)(($low + $high) / 2);
if ($nums[$mid] == $target) {
$result = $mid; // 找到目标值
if ($findStart) {
$high = $mid - 1; // 向左缩小范围查找起始位置
} else {
$low = $mid + 1; // 向右缩小范围查找结束位置
}
} elseif ($nums[$mid] < $target) {
$low = $mid + 1; // 目标值在右侧
} else {
$high = $mid - 1; // 目标值在左侧
}
}
return $result; // 返回找到的索引或 -1
}