题目:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
这个题的目标是合并所有重叠的区间。解题思路是,先把数组的元素进行排序,再合并区间。
为什么要排序呢?因为将区间按照起始元素排序,才能让我们非常清晰地识别重叠的区间。
排序:首先,根据每个区间的起始元素对区间进行排序(按照首元素从小到大排)。
合并:然后,遍历排序后的区间列表,检查当前区间是否与前一个区间重叠。 如果重叠,合并这两个区间;如果不重叠,将当前区间添加到结果列表中。
具体步骤:
- 排序:使用 Arrays.sort 方法对区间进行排序,排序的依据是每个区间的起始元素大小。
- 合并:使用一个 LinkedList 来存储合并后的区间。遍历排序后的区间列表,对于每个区间,检查它是否与 LinkedList 中最后一个区间重叠。如果重叠,合并这两个区间;如果不重叠,将当前区间添加到 LinkedList 中。
- 返回结果:将 LinkedList 转换为数组并返回。
我的Java代码:
[code]class Solution { public int[][] merge(int[][] intervals) { if (intervals.length a[0] - b[0]); LinkedList merged = new LinkedList(); merged.add(intervals[0]); int length = intervals.length; for (int i = 1; i < length; i++) { int[] current = intervals; int[] lastMerged = merged.getLast(); // 检查当前区间是否与最后一个合并的区间重叠 if (current[0] |