题目
以数组 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].
题解
方式一:排序
public int[][] merge(int[][] intervals) {
// 首元素升序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
// LinkedList插入更快
List<int[]> result = new LinkedList<>();
// 指针指向第一个元素
int[] cur = intervals[0];
for (int[] interval : intervals) {
if (cur[1] >= interval[0]) {
// 需要合并,更新右边界
cur[1] = Math.max(cur[1], interval[1]);
} else {
// 不需要合并,加入结果集,移动指针
result.add(cur);
cur = interval;
}
}
// 处理最后一个区间被合并的情况
result.add(cur);
return result.toArray(new int[0][]);
}
总结
算法:自定义比较器