Заявление о проблеме – *Учитывая набор непересекающих интервалов, вставьте новый интервал в интервалы (при необходимости слияйте).
Вы можете предположить, что интервалы были первоначально отсортированы в соответствии с их временем начала*
Пример – “” ” Ввод: интервалы = [[1,3], [6,9]], NewInterval = [2,5] Выход: [[1,5],[6,9]] “”” Мой первоначальный подход – вставьте Ньюэйнтерваль
в положении, так что массив интервалов остается отсортированным по Начало каждого интервала Анкет После того, как я вставил NewInterval, я могу объединить все интервалы, где это возможно. Решение
class Solution: def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: if len(intervals) == 0: return [newInterval] intervals.append(newInterval) intervals = sorted(intervals, key = lambda x : x[0]) # now merge the intervals i = 1 while i < len(intervals): p_i = intervals[i-1] c_i = intervals[i] if p_i[0] <= c_i[0] and c_i[0] <= p_i[-1]: intervals[i-1] = [p_i[0], max(c_i[-1], p_i[-1])] del intervals[i] else: i += 1 return intervals
TC – O (nlogn + n^2) из -за сортировки и удаления.
Как мы можем оптимизировать это ??
Мы можем использовать бинарный поиск для определения индекса.
class Solution: def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: if len(intervals) == 0: return [newInterval] intervals.append(newInterval) intervals = sorted(intervals, key = lambda x : x[0]) lo = 0 hi = len(intervals) - 1 idx = 0 while lo < hi: mid = (lo + hi)//2 if intervals[mid][0] <= newInterval[0]: idx = max(idx, mid) lo = mid + 1 else: hi = mid - 1 intervals.insert(idx + 1, newInterval) # now merge the intervals i = 1 while i < len(intervals): p_i = intervals[i-1] c_i = intervals[i] if p_i[0] <= c_i[0] and c_i[0] <= p_i[-1]: intervals[i-1] = [p_i[0], max(c_i[-1], p_i[-1])] del intervals[i] else: i += 1 return intervals
Оригинал: “https://dev.to/skbhagat40/leetcode-september-day12-3lgk”