区间合并(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]。
解题思路
-
排序预处理:
将所有区间按照起始位置升序排序。这样相邻的区间在位置上更可能重叠,便于顺序处理。 -
遍历合并:
- 初始化一个空列表
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]):合并后取最大结束位置。 - 单区间:无需合并,直接返回。