LC 56贪心中等第 68 / 95 题

合并区间

Merge Intervals

排序扫描合并
本机进度仅保存在当前浏览器

题目描述

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

示例:intervals = [[1, 3], [2, 6], [8, 10], [15, 18]],输出 [[1, 6], [8, 10], [15, 18]]。

解题思路

  1. 先按左端点排序,使所有可能重叠的区间相邻,扫描一遍即可完成合并。
  2. 维护当前合并区间:下一个区间左端点 <= 当前右端点则重叠,右端点取两者较大值(覆盖包含关系)。
  3. 不重叠则把当前区间存档,开启新区间。

参考实现

查看参考实现Python · 建议先自行作答
def merge(intervals):
    intervals.sort(key=lambda x: x[0])
    res = []
    for start, end in intervals:
        # 与上一区间重叠则延伸右端点
        if res and start <= res[-1][1]:
            res[-1][1] = max(res[-1][1], end)
        else:
            res.append([start, end])
    return res

复杂度与归属

时间复杂度O(n log n)
空间复杂度O(log n)
所属分类贪心
题源LeetCode 56

关联教程

返回题图鉴