57-Insert Interval

题意

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Example 1:

  • Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
  • Output: [[1,5],[6,9]]

Example 2:

  • Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
  • Output: [[1,2],[3,10],[12,16]]
  • Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

Example 3:

  • Input: intervals = [], newInterval = [5,7]
  • Output: [[5,7]]

Example 4:

  • Input: intervals = [[1,5]], newInterval = [2,3]
  • Output: [[1,5]]

  • Example 5:
  • Input: intervals = [[1,5]], newInterval = [2,7]
  • Output: [[1,7]]

Constraints:

  • 0 <= intervals.length <= 10^4
  • intervals[i].length == 2
  • 0 <= intervals[i][0] <= intervals[i][1] <= 10^5
  • intervals is sorted by intervals[i][0] in ascending order.
  • newInterval.length == 2
  • 0 <= newInterval[0] <= newInterval[1] <= 10^5

思路

  • 将new interval加入
  • 调用56题merge intervals
class Solution(object):
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[List[int]]
        :type newInterval: List[int]
        :rtype: List[List[int]]
        """
        intervals.append(newInterval)
        return self.merge(intervals)
    
    def merge(self, intervals):
        if not intervals: return intervals
        intervals = sorted(intervals, key = lambda x:x[0])
        start, end = intervals[0][0], intervals[0][1]
        res = []
        
        for i in intervals:
            s, e = i[0], i[1]
            if s <= end:
                end = max(e, end)
            else:
                res.append([start, end])
                start, end = s, e
            
        res.append([start,end])
        return res

分析

  • Time: O(nlogn)
  • Space: O(n)

© 2020. All rights reserved.