区间合并(Merge Intervals)
字数 1130 2025-10-27 22:14:43

区间合并(Merge Intervals)

题目描述
给定一个区间集合 intervals,每个区间表示为 [start, end]。请合并所有重叠的区间,并返回一个不重叠的区间集合。

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


解题思路

  1. 排序预处理
    将所有区间按照起始位置升序排序。这样相邻的区间在位置上更可能重叠,便于顺序处理。

  2. 遍历合并

    • 初始化一个空列表 result 用于存储合并后的区间。
    • 依次检查每个区间:
      • 如果 result 为空或当前区间与 result 中最后一个区间不重叠(当前区间的起始位置 > 最后一个区间的结束位置),则直接将当前区间加入 result
      • 否则,当前区间与最后一个区间重叠,更新 result 最后一个区间的结束位置为两者结束位置的较大值(合并操作)。
  3. 关键点

    • 排序后,重叠的区间一定会相邻,无需回头检查。
    • 合并时只需比较当前区间和 result 中最后一个区间。

详细步骤(以示例 [[1,3],[2,6],[8,10],[15,18]] 为例)

  1. 排序
    区间已按起始位置排序,顺序为 [1,3], [2,6], [8,10], [15,18]

  2. 遍历合并

    • 初始 result = []
    • 处理 [1,3]result 为空,直接加入 → result = [[1,3]]
    • 处理 [2,6]
      • 比较 [2,6]result 最后一个区间 [1,3]:因为 2 ≤ 3,说明重叠。
      • 合并:更新 [1,3] 的结束位置为 max(3,6)=6result = [[1,6]]
    • 处理 [8,10]
      • 比较 8 > 6,不重叠,直接加入 → result = [[1,6],[8,10]]
    • 处理 [15,18]
      • 比较 15 > 10,不重叠,直接加入 → result = [[1,6],[8,10],[15,18]]
  3. 输出结果[[1,6],[8,10],[15,18]]


复杂度分析

  • 时间复杂度:O(n log n),主要来自排序。
  • 空间复杂度:O(log n)(排序的栈空间)或 O(n)(存储结果)。

边界情况考虑

  • 空输入:直接返回空列表。
  • 完全覆盖的区间(如 [1,5][2,3]):合并后取最大结束位置。
  • 单区间:无需合并,直接返回。
区间合并(Merge Intervals) 题目描述 给定一个区间集合 intervals ,每个区间表示为 [start, end] 。请合并所有重叠的区间,并返回一个不重叠的区间集合。 示例: 输入: intervals = [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠,合并为 [1,6] 。 解题思路 排序预处理 : 将所有区间按照 起始位置 升序排序。这样相邻的区间在位置上更可能重叠,便于顺序处理。 遍历合并 : 初始化一个空列表 result 用于存储合并后的区间。 依次检查每个区间: 如果 result 为空或当前区间与 result 中最后一个区间不重叠(当前区间的起始位置 > 最后一个区间的结束位置),则直接将当前区间加入 result 。 否则,当前区间与最后一个区间重叠,更新 result 最后一个区间的结束位置为两者结束位置的较大值(合并操作)。 关键点 : 排序后,重叠的区间一定会相邻,无需回头检查。 合并时只需比较当前区间和 result 中最后一个区间。 详细步骤 (以示例 [[1,3],[2,6],[8,10],[15,18]] 为例) 排序 : 区间已按起始位置排序,顺序为 [1,3], [2,6], [8,10], [15,18] 。 遍历合并 : 初始 result = [] 。 处理 [1,3] : result 为空,直接加入 → result = [[1,3]] 。 处理 [2,6] : 比较 [2,6] 与 result 最后一个区间 [1,3] :因为 2 ≤ 3 ,说明重叠。 合并:更新 [1,3] 的结束位置为 max(3,6)=6 → result = [[1,6]] 。 处理 [8,10] : 比较 8 > 6 ,不重叠,直接加入 → result = [[1,6],[8,10]] 。 处理 [15,18] : 比较 15 > 10 ,不重叠,直接加入 → result = [[1,6],[8,10],[15,18]] 。 输出结果 : [[1,6],[8,10],[15,18]] 。 复杂度分析 时间复杂度:O(n log n),主要来自排序。 空间复杂度:O(log n)(排序的栈空间)或 O(n)(存储结果)。 边界情况考虑 空输入:直接返回空列表。 完全覆盖的区间(如 [1,5] 和 [2,3] ):合并后取最大结束位置。 单区间:无需合并,直接返回。