合并区间 其他算法导航栏
- 以数组 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].
解题思路
- 1、首先,将区间按照起始位置进行排序,这样可以确保相邻的区间能够连续合并。
- 2、遍历排序后的区间数组,使用一个新的区间列表 result 来存储合并后的区间。
- 3、对于每个区间 intervals[i],如果 result 为空或者当前区间的起始位置大于 result 中最后一个区间的结束位置,则说明当前区间与 result 中的区间不重叠,直接将当前区间加入 result 中。
- 4、否则,当前区间与 result 中的最后一个区间重叠,合并两个区间,更新 result 中最后一个区间的结束位置为当前区间的结束位置与 result 中最后一个区间的结束位置中的较大值。
- 5、遍历完成后,result 中存储的即为合并后的不重叠区间数组。
Java实现
public class MergeIntervals {
public static int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[0][];
}
// 按照起始位置进行排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
//结果列表
List<int[]> result = new ArrayList<>();
//先将第一个区间加入
result.add(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
//当前区间
int[] currentInterval = intervals[i];
//上一个区间
int[] lastInterval = result.get(result.size() - 1);
// 判断当前区间是否和下一个区间有重叠
// 当前区间的起始位置大于结果列表中最后一个区间的结束位置,则不重叠
if (currentInterval[0] > lastInterval[1]) {
//不重叠,直接加入结果列表
result.add(currentInterval);
} else {
// 合并重叠区间
lastInterval[1] = Math.max(lastInterval[1], currentInterval[1]);
}
}
return result.toArray(new int[result.size()][]);
}
public static void main(String[] args) {
MergeIntervals mergeIntervals = new MergeIntervals();
int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
int[][] result = mergeIntervals.merge(intervals);
for (int[] interval : result) {
System.out.println(Arrays.toString(interval));
}
}
}
时间空间复杂度
- 时间复杂度:O(nlogn),其中 n 是区间的个数,排序的时间复杂度为 O(nlogn),遍历合并的时间复杂度为 O(n)。
- 空间复杂度:O(n),用于存储合并后的不重叠区间数组。