题目描述
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
求解思路
-
首先将数组按照第一维度进行升序排序;
-
遍历每个数组,比较当前区间的头和上个区间的尾:如果当前的头大于上个的尾,说明俩区间没有重合,将上一个区间加入res就行;
-
但是如果当前头小于或者相等上一个区间的尾,则可以将这俩区间合并,区间左起点就是上个区间的左起点(因为已经排过序了),合并后的区间的右终点是这俩区间右终点的最大值;
-
至此,将当前合并后的区间复制给pre,在下一个区间再判断是否重合;
-
最后只需要将res转为数组输出即可。
输入输出示例
代码
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(o1,o2)->(o1[0]-o2[0]));
int n = intervals.length;
List<int[]> res = new LinkedList<>();
int[] pre = intervals[0];
for(int i = 1; i < n; i++){
int[] cur = intervals[i];
if(pre[1] >= cur[0]){
pre = new int[]{pre[0],Math.max(pre[1],cur[1])};
}else{
res.add(pre);
pre = cur;
}
}
res.add(pre);
return res.toArray(new int[res.size()][]);
}
}