难度 medium
以数组 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].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104
解题思路:这道题目还是不难的,就是有几个地方要注意一下,一个是要重写sort方法的compare函数,这里用了匿名类的方法实现,主要是实现二维数组的排序,对二维数组里的每个数组num,先按第一个数排序,第一个数相等的情况下按第二个数排序,然后,就是用一个left和right记录当前区间的左右边界,并且往前遍历,判断是否可以合并到当前区间,当下一个数组的第一个数比当前right小的时候,需要进行一次合并,右边界更改为下一个数组的第二个数和当前right中的最大值,因为可能出现[1,4],[2,3]这种情况,当无法满足下一个数组的第一个数比当前right小的时候,就把结果先保存,然后left和right更新为下一个数组的第一和第二个数,继续往下遍历,主要还有最后一个需要注意的地方,那就是二维数组遍历之后,需要把最后一个数组所代表的区间边界加入结果中。
代码 t75 s5
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals, new Comparator<int[]>(){
public int compare(int[] a, int[] b){
if(a[0]==b[0]){
return a[1] - b[1];
}else{
return a[0] - b[0];
}
}
});
List<int[]> ans = new ArrayList<>();
int left = intervals[0][0], right = intervals[0][1];
for(int i=1; i<intervals.length; i++){
if(right>=intervals[i][0]){
right = Math.max(right, intervals[i][1]);
}else{
int[] t = {left, right};
ans.add(t);
if(i<intervals.length){
left = intervals[i][0];
right = intervals[i][1];
// System.out.println("left: " + left + " right: " + right);
}
}
}
ans.add(new int[]{left, right});
int[][] res = ans.toArray(new int[0][]);
return res;
}
}
参考资料:
https://blog.csdn.net/qq_41682302/article/details/95949646
http://c.biancheng.net/view/916.html