题目描述

[EN | CN]

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

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

示例 2:

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

解法 1:排序+合并

题目不难,理清思路就好了。每个区间都由 start 跟 end 组成,我们先按照 start 排序,然后遍历对比相邻区间。如果后区间的 start 小于或等于前区间的 end,我们就可以判断两个有重叠,进行合并。

假设数组长度为 $n$,那么

  • 时间复杂度为 $O(n\log n)$,排序+一次遍历;
  • 空间复杂度为 $O(n)$,存储结果,如果可以 inplace 修改则为 $O(1)$。

实现与结果如下:

1
2
3
4
5
6
7
8
9
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        rets = []
        for interval in sorted(intervals, key=lambda interval:interval[0]):
            if rets and interval[0] <= rets[-1][1]:
                rets[-1][1] = max(rets[-1][1], interval[1])
            else:
                rets.append(interval)
        return rets
  • 执行用时:52 ms,在所有 Python3 提交中击败了 72.47% 的用户。
  • 内存消耗:14.7 MB,在所有 Python3 提交中击败了 18.75% 的用户。