Найдите и объясните ошибку в этом фрагменте Python, предназначенном для объединения интервалов: def merge(intervals): intervals.sort(); res=[]; for a,b in intervals: if not res or res[-1][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(nlogn)O(n \log n)O(nlogn) (сортировка) + O(n)O(n)O(n) проход → в сумме O(nlogn)O(n \log n)O(nlogn). - Пространственная: дополнительный результат до O(n)O(n)O(n). Если не считать выходные данные, дополнительная память O(logn)O(\log n)O(logn) для сортировки (в зависимости от реализации).
Пример, где оригинал даёт неверный результат:
- Вход: [[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(nlogn)O(n \log n)O(nlogn) (сортировка) + O(n)O(n)O(n) проход → в сумме O(nlogn)O(n \log n)O(nlogn).
- Пространственная: дополнительный результат до O(n)O(n)O(n). Если не считать выходные данные, дополнительная память O(logn)O(\log n)O(logn) для сортировки (в зависимости от реализации).