文章目录
-
- 一、题目描述
-
- [🔍 示例](#🔍 示例)
- 二、题意分析与思考导图
- 三、算法思路讲解
-
- [解法核心思路(排序 + 区间合并)](#解法核心思路(排序 + 区间合并))
- 过程可视化
- 四、详细示例推演
- 五、代码实现(Java版本)
- 六、复杂度分析
一、题目描述
给定一个区间集合,请你合并所有重叠的区间。
每个区间 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]- 其他区间之间没有交集
二、题意分析与思考导图
下面的思维导图展示了解题整体思路 👇
合并区间
题意理解
区间可能重叠
输出非重叠区间集合
关键思路
按起点排序
依次遍历区间
判断是否重叠
若重叠则合并
实现细节
排序 -> 遍历 -> 合并 -> 输出结果
复杂度分析
n log n
n
三、算法思路讲解
解法核心思路(排序 + 区间合并)
- 排序:首先按每个区间的起点升序排列。这样处理后的区间更容易判断重叠关系。
- 遍历 & 合并 :
用一个变量(如merged)维护合并后的列表。
对每个区间:- 如果当前区间的起点 > 已合并区间的末尾,说明没有重叠,直接加入结果;
- 否则,说明有重叠,更新末尾为较大值(即
max(end1, end2))。
过程可视化
下面用流程图展示算法执行流程:
是
否
开始
按区间起点排序
初始化 merged 为空列表
遍历每个区间
merged为空 或 当前区间起点 > merged.last.end ?
加入 merged 列表
更新 merged.last.end = max(merged.last.end, 当前区间.end)
继续下一个区间
输出 merged 作为结果
结束
四、详细示例推演
假设输入:
intervals = [[1,3], [2,6], [8,10], [15,18]]
1️⃣ 排序后结果(按起点):
[[1,3], [2,6], [8,10], [15,18]]
2️⃣ 遍历:
- 初始化结果
merged = [] - 第一个区间
[1,3]→ 直接加入merged
👉 merged = [[1,3]] - 第二个区间
[2,6]→2 <= 3,有重叠 → 合并成[1,6]
👉 merged = [[1,6]] - 第三个区间
[8,10]→8 > 6,无重叠 → 直接加入
👉 merged = [[1,6],[8,10]] - 第四个区间
[15,18]→15 > 10,无重叠 → 直接加入
👉 merged = [[1,6],[8,10],[15,18]]
✅ 最终结果:[[1,6],[8,10],[15,18]]
五、代码实现(Java版本)
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MergeIntervals {
public int[][] merge(int[][] intervals) {
// 1. 按区间起点排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
// 2. 初始化结果列表
List<int[]> merged = new ArrayList<>();
// 3. 遍历每个区间
for (int[] interval : intervals) {
// 如果结果为空 或 当前起点 > merged最后一个区间的终点
if (merged.isEmpty() || interval[0] > merged.get(merged.size() - 1)[1]) {
merged.add(interval); // 无重叠区间,直接加入
} else {
// 存在重叠,取最大终点更新
merged.get(merged.size() - 1)[1] = Math.max(
merged.get(merged.size() - 1)[1], interval[1]
);
}
}
// 4. 转换为数组返回
return merged.toArray(new int[merged.size()][]);
}
// 测试
public static void main(String[] args) {
MergeIntervals m = new MergeIntervals();
int[][] intervals = {{1,3},{2,6},{8,10},{15,18}};
int[][] result = m.merge(intervals);
System.out.println(Arrays.deepToString(result));
// 输出: [[1,6],[8,10],[15,18]]
}
}
六、复杂度分析
| 指标 | 分析 |
|---|---|
| 时间复杂度 | O(n log n),主要来源于排序操作。遍历合并部分为 O(n) |
| 空间复杂度 | O(n),用于存储合并后的区间结果 |