Найдите и объясните ошибку в этом фрагменте Python, предназначенном для объединения интервалов: def merge(intervals): intervals.sort(); res=[]; for a,b in intervals: if not res or res[-1][1]

27 Окт в 13:34
6 +2
0
Ответы
1
Ошибка в условии слияния: код проверяет res[−1][1]<bres[-1][1] < bres[1][1]<b (сравнивает конец предыдущего интервала с концом текущего), а нужно сравнивать с началом текущего интервала. Правильное условие — неналожение, когда конец предыдущего < начало текущего: res[−1][1]<ares[-1][1] < ares[1][1]<a.
Пример, где оригинал даёт неверный результат:
- Вход: [[1,3],[2,4]][[1,3],[2,4]][[1,3],[2,4]].
- Ожидаемый результат: [[1,4]][[1,4]][[1,4]].
- Оригинал (с res[−1][1]<bres[-1][1] < bres[1][1]<b) добавит второй интервал отдельно, т.к. 3<43 < 43<4 — неверно.
Исправленный код:
def merge(intervals):
intervals.sort(key=lambda x: x[0])
res = []
for a, b in intervals:
if not res or res[-1][1] < a:
res.append([a, b])
else:
res[-1][1] = max(res[-1][1], b)
return res
Комментарии:
- Явная сортировка по началу интервала безопаснее: .sort(key=lambdax:x[0]).sort(key=lambda x: x[0]).sort(key=lambdax:x[0]).
- Следует использовать Python-ключевое слово `return`.
Сложность:
- Временная: O(nlog⁡n)O(n \log n)O(nlogn) (сортировка) + O(n)O(n)O(n) проход → в сумме O(nlog⁡n)O(n \log n)O(nlogn).
- Пространственная: дополнительный результат до O(n)O(n)O(n). Если не считать выходные данные, дополнительная память O(log⁡n)O(\log n)O(logn) для сортировки (в зависимости от реализации).
27 Окт в 13:54
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир