题目:
以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
思路:
这道题目要求合并一个区间数组中所有重叠的区间。可以按照以下步骤来解决这个问题:
- 排序: 首先需要对区间数组按照区间的起始值进行排序。这样做是为了方便处理重叠的情况。
- 合并: 遍历排序后的区间数组,如果当前区间与上一个合并后的区间有重叠,则将它们合并为一个新的区间。否则,将当前区间添加到结果数组中。
- 返回结果: 最后返回合并后的不重叠区间数组。
import java.util.Arrays;
import java.util.LinkedList;
public class no_56 {
public static void main(String[] args) {
int[][] arr = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};
int[][] merge = merge(arr);
for (int[] part : merge) {
System.out.println(Arrays.toString(part));
}
}
public static int[][] merge(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
LinkedList<int[]> merged = new LinkedList<>();
for (int[] interval : intervals) {
if (merged.isEmpty() || merged.getLast()[1] < interval[0]) {
merged.add(interval);
} else {
merged.getLast()[1] = Math.max(merged.getLast()[1], interval[1]);
}
}
return merged.toArray(new int[merged.size()][]);
}
}
代码解释
- 首先对区间数组按照区间起始值进行排序。
- 创建一个链表
merged
来存储合并后的区间。- 遍历排序后的区间数组:
- 如果
merged
为空,或者当前区间与上一个区间不重合,直接将当前区间添加到merged
中。- 否则,重置
merged
中最后一个区间的终止位置为当前区间终止位置与其本身终止位置的较大值。- 最后,将
merged
转换为数组并返回。