合并区间
字数 1178 2025-10-26 14:00:26
合并区间
题目描述
给定一个区间的集合 intervals,其中每个区间表示为 intervals[i] = [start_i, end_i]。你需要合并所有重叠的区间,并返回一个不重叠的区间数组,且这些区间应覆盖输入中的所有区间。
示例
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠,合并为 [1,6]。
解题过程
-
理解问题与关键点
- 目标:合并有重叠的区间(例如 [1,3] 和 [2,4] 重叠,因为 3 ≥ 2)。
- 重叠条件:若区间 A 的结束点 ≥ 区间 B 的开始点,则 A 和 B 可合并。
- 合并操作:取两个区间的最小开始点和最大结束点,生成新区间。
-
核心思路:排序
- 若区间按开始点排序,则重叠的区间会相邻排列,便于顺序处理。
- 排序后,只需比较当前区间与已合并列表中的最后一个区间即可判断是否重叠。
-
逐步求解
步骤 1:排序区间
按每个区间的开始点升序排序。
示例:输入 [[1,3],[2,6],[8,10],[15,18]] 排序后为 [[1,3],[2,6],[8,10],[15,18]](本身已有序)。步骤 2:初始化合并列表
创建空列表merged存储结果。将第一个区间直接加入merged。步骤 3:遍历与合并
从第二个区间开始遍历:- 若当前区间的开始点 ≤
merged中最后一个区间的结束点,说明重叠,更新最后一个区间的结束点为两者结束点的最大值。 - 否则,无重叠,直接将当前区间加入
merged。
示例演示
- 初始:
merged = [[1,3]] - 处理 [2,6]:2 ≤ 3?是,重叠 → 更新最后一个区间为 [1, max(3,6)=6] →
merged = [[1,6]] - 处理 [8,10]:8 ≤ 6?否,无重叠 → 加入
merged = [[1,6],[8,10]] - 处理 [15,18]:15 ≤ 10?否,无重叠 → 加入
merged = [[1,6],[8,10],[15,18]]
- 若当前区间的开始点 ≤
-
算法复杂度
- 时间复杂度:O(n log n),主要来自排序。
- 空间复杂度:O(n),存储合并结果(若忽略输出空间则为 O(1))。
-
边界情况处理
- 空输入:直接返回空列表。
- 无重叠区间:如输入 [[1,2],[3,4]],排序后直接返回原列表。
- 完全包含区间:如 [[1,4],[2,3]],合并为 [1,4]。
总结
通过排序将区间按开始点排列,再顺序合并重叠区间,可高效解决问题。关键在于理解排序后重叠区间的局部性,以及合并时仅需比较相邻区间。