Рубрики
Без рубрики

Leetcode сентябрьский день12

Заявление о проблеме – *Учитывая набор непересекающих интервалов, вставьте новый интервал в Interva … Tagged с Python, информатикой.

Заявление о проблеме – *Учитывая набор непересекающих интервалов, вставьте новый интервал в интервалы (при необходимости слияйте).

Вы можете предположить, что интервалы были первоначально отсортированы в соответствии с их временем начала*

Пример – “” ” Ввод: интервалы = [[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”