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].
代码
class Solution {
public int[][] merge(int[][] intervals) {
//根据左区间升序排序
Arrays.sort(intervals,(o1, o2) -> Integer.compare(o1[0], o2[0]));
LinkedList<int[]> res = new LinkedList<>(); //结果集
res.add(intervals[0]); //放入第一个区间
for(int i=1; i < intervals.length; i++){
int[] per = res.getLast(); //获取上一个加入的区间
int[] cur = intervals[i]; //当前区间
//区间不重叠,当前左区间大于之前右区间
if(cur[0] > per[1]){
res.add(cur); //直接添加当前区间
}
//区间重叠,当前左区间小于等于之前右区间
else{
//需要更新之前加入res的区间
int left = per[0]; //合并后的新左区间
int right = Math.max(per[1], cur[1]); //合并后的新右区间
res.removeLast(); //移除老区间
res.add(new int[]{left, right}); //加入新区建
}
}
return res.toArray(new int[res.size()][2]); //把res转为数组返回
}
}