Сложность: medium
Вам дан массив непересекающихся интервалов
intervals, где intervals[i] = [starti, endi] представляет начало и конец i-го интервала, и массив intervals отсортирован в порядке возрастания по starti. Вам также дан интервал newInterval = [start, end], представляющий начало и конец другого интервала.Вставьте
newInterval в массив intervals так, чтобы intervals оставался отсортированным в порядке возрастания по starti и в intervals не было бы перекрывающихся интервалов (при необходимости объедините перекрывающиеся интервалы).Верните массив
intervals после вставки.Обратите внимание, что не обязательно модифицировать массив
intervals на месте. Вы можете создать новый массив и вернуть его.Пример:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
👨💻 Алгоритм:
1⃣Инициализация переменных:
Инициализируются переменные n и i для хранения размера массива интервалов и текущего индекса соответственно, а также пустой массив res для хранения результата.
2⃣Обработка случаев без перекрытия и с перекрытием:
В случае отсутствия перекрытия до вставки, проходим через массив интервалов до тех пор, пока конечная точка текущего интервала меньше начальной точки нового интервала. Добавляем текущий интервал в массив res и переходим к следующему.
В случае перекрытия, продолжаем обход, пока начальная точка нового интервала меньше или равна конечной точке текущего интервала. Обновляем начальные и конечные точки нового интервала, объединяя перекрывающиеся интервалы в один.
3⃣Обработка интервалов после вставки:
Проходим через оставшиеся интервалы после индекса i и добавляем их в массив res. Это включает интервалы, которые следуют после нового интервала и не перекрываются с ним.
Возвращаем массив res, содержащий все интервалы с корректно вставленным новым интервалом.
😎 Решение:
class Solution {
public function insert($intervals, $newInterval) {
$res = [];
$i = 0;
// Process intervals with no overlap before the new interval
while ($i < count($intervals) && $intervals[$i][1] < $newInterval[0]) {
array_push($res, $intervals[$i]);
$i++;
}
// Merge overlapping intervals with newInterval
while ($i < count($intervals) && $newInterval[1] >= $intervals[$i][0]) {
$newInterval[0] = min($newInterval[0], $intervals[$i][0]);
$newInterval[1] = max($newInterval[1], $intervals[$i][1]);
$i++;
}
array_push($res, $newInterval);
// Append remaining intervals after merging
while ($i < count($intervals)) {
array_push($res, $intervals[$i]);
$i++;
}
return $res;
}
}Ставь 👍 и забирай 📚 Базу знаний