题目
以数组 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] 可被视为重叠区间。
题解
class Solution {
public int[][] merge(int[][] intervals) {
//按照数组起始位置进行排序
Arrays.sort(intervals,(v1,v2)->v1[0]-v2[0]);//v1,v2为intervals里面的一个个小数组
int ind=-1;
int[][] res=new int[intervals.length][2];
for(int[] interval:intervals){
//如果结果数组为空或者当前数组的结束位置小于interval的起始位置,则interval直接加入结果数组
if(ind==-1||interval[0]>res[ind][1]){
res[++ind]=interval;
}else{//合并结束的索引位置
res[ind][1]=Math.max(res[ind][1],interval[1]);
}
}
return Arrays.copyOf(res,ind+1);//第二个参数是复制后的数组长度
}
}
笔记:
-
先根据区间的起始位置排序,再进行 n -1次 两两合并。
-
2 个区间的关系有以下 6 种,但是其实可以变成3 种情况(只需要假设 第一个区间的起始位置≤ 第二个区间的起始位置,如果不满足这个假设,交换这两个区间)。这三种情况为部分重合,完全包含,完全不包含
-
lambda 表达式的语法格式如下:
(parameters) -> expression 或 (parameters) ->{ statements; }