题目:56.合并区间
以数组 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] 可被视为重叠区间。
- 提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4
思路
输入检查:
- 如果输入数组为空或只有一个区间,直接返回输入。
排序区间:
- 使用
Arrays.sort
方法对区间按照起始位置进行排序。
- 使用
初始化结果列表和当前区间:
- 创建一个
List<int[]>
用于存储合并后的区间。 - 初始化第一个区间为当前区间,并将其加入结果列表。
- 创建一个
遍历排序后的区间:
- 对于每个区间,检查它是否与当前区间重叠。
- 如果重叠,合并它们,即更新当前区间的结束位置为两者结束位置的最大值。
- 如果不重叠,将当前区间更新为下一个区间,并将其加入结果列表。
返回结果:
- 将结果列表转换为二维数组并返回。
- 时间复杂度:O(nlog₂n)
- 空间复杂度:O(n)
代码
public int[][] merge(int[][] intervals) {
if (intervals.length == 0 || intervals.length == 1) {
return intervals;
}
List<int[]> mergedIntervals = new ArrayList<>();
// 按区间的起始位置排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
// 初始化第一个区间为当前区间
int[] currentInterval = intervals[0];
// 将当前区间加入列表
mergedIntervals.add(currentInterval);
for (int[] interval : intervals) {
// 如果当前区间的结束位置大于等于下一个区间的开始位置,说明有重叠,合并区间
if (interval[0] <= currentInterval[1]) {
currentInterval[1] = Math.max(currentInterval[1], interval[1]);
} else {
// 否则,没有重叠,更新当前区间为下一个区间,并将其加入结果列表
currentInterval = interval;
mergedIntervals.add(currentInterval);
}
}
// 将结果列表转换为二维数组并返回
return mergedIntervals.toArray(new int[mergedIntervals.size()][]);
}