56_合并区间[MEDIUM]
约 429 字大约 1 分钟
2026-03-23
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。
请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。示例 3:
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。解题思路
- 先按每个子数组的首元素排序
Arrays.sort - 初始化结果集
List<int[]> result,先放入第一组 (如[1,3]) - 两两比较,【前一组的第二个元素】
last[1]是否比【后一组的第一个元素】curr[0]大 ?[1,3],[2,6]
- 如果是,说明有重叠,合并,注意
[1,3] [2,4]和[1,4] [2,3]两种情况 - 如果否,添加一组结果
- 最后将结果集转数组返回
Java实现
public int[][] merge(int[][] intervals) {
if (intervals.length <= 1){
return intervals;
}
// 先排序
Arrays.sort(intervals, (a,b) -> Integer.compare(a[0], b[0]));
List<int[]> result = new ArrayList<>();
// 初始化第一组
result.add(intervals[0]);
// 从第二组开始,两两比较
for (int i = 1; i < intervals.length; i++){
int[] curr = intervals[i];
int[] last = result.get(result.size()-1); // 取 result 的最后一个,而不是 intervals 的
// 有重叠,比较两个尾巴,谁大
if (curr[0] <= last[1]){
last[1] = Math.max(last[1], curr[1]); // 注意 [1,4] [2,3] 情况
} else {
// 无重叠
result.add(curr);
}
}
return result.toArray(new int[result.size()][]);
}