LC 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

Solution:

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        if len(intervals) == 1:
            return intervals
        intervals.sort()
        newIntervals = [intervals[0]]
        for i in range(1, len(intervals)):
            left = newIntervals[-1]
            right = intervals[i]
            if left[1] < right[0]:
                newIntervals.append(right)
            else:
                newIntervals[-1] = [min(left[0], right[0]), max(left[1], right[1])]
        return newIntervals

解题思路:
合并区间,首先我们想到给区间排序,让intervals按照起始的大小sort一下,避免前后大小不一样,排序后我们其实只要每一次只和后一位比较就可以了。接着想合并的情况,一共有三种情况,如下图所示,搞明白有三种情况就好写了。


explanation.png

这里我把intervals的第一个列表先存起来,这样每一次我只要比较newIntervals的最后一个元素和原intervals的第一个元素。
1.第一种情况,不多说,直接append到newIntervals

  1. 第二种情况,两个区间有部分重合,修改newIntervals里的最后一个元素为[left.start, right.end]
  2. 第三种情况完全重合,就取范围大的那个,也就是我们从interval新拿出来比较的元素不需要更新到我们的newIntervals里
    最后我综合了一下23两种情况,合并为一种情况,两区间比较只要有覆盖,那么我新区间的左边取两个中最小的start,右边取两个中最大的end。

你可能感兴趣的:(LC 合并区间)