Сложность: medium
Дан массив
nums, отсортированный в порядке неубывания, и число target. Необходимо найти начальную и конечную позицию target в nums. Если
target не найден, вернуть [-1, -1]. Алгоритм должен работать за
O(log n). Пример:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
👨💻 Алгоритм:
1⃣Используем бинарный поиск, чтобы найти первое вхождение
target. 2⃣Аналогично находим последнее вхождение
target. 3⃣Возвращаем найденные индексы или
[-1, -1], если target отсутствует. 😎 Решение:
class Solution {
function searchRange($nums, $target) {
return [$this->binarySearch($nums, $target, true), $this->binarySearch($nums, $target, false)];
}
function binarySearch($nums, $target, $findFirst) {
$left = 0;
$right = count($nums) - 1;
$index = -1;
while ($left <= $right) {
$mid = intdiv($left + $right, 2);
if ($nums[$mid] == $target) {
$index = $mid;
if ($findFirst) {
$right = $mid - 1;
} else {
$left = $mid + 1;
}
} elseif ($nums[$mid] < $target) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
return $index;
}
}Ставь 👍 и забирай 📚 Базу знаний