题目描述
力扣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].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
题目分析
- 对sort自定义排序,一维升序,二维降序。利用lambda表达式,注意记一下。
- 不能用二维数组作为结果集,因为数组的长度需要提前设定,但是无法得知。所以若有多余的会用[0] [0]补全;
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length < 2) return intervals;
Arrays.sort(intervals, (o1, o2) -> {
if(o1[0] == o2[0]){
return o2[1] - o1[1];
}
else{
return o1[0] - o2[0];
}
});
//int[][] res = new int[intervals.length][2];//用来存储结果的二位数组,yo
List<int[]> res = new ArrayList<>();
int max = intervals[0][1];
//int idx = 0;
res.add(intervals[0]);//先把第一个区间加进去
//再进行遍历且对第二维进行比较,如果当前的值大于max,
//1.当前一维数组的头(第一维)与尾(max)比较,如果头<尾,则说明区间重叠,则更新max,并更新而伟结果数组中的区间
//2. 若头>尾,则不重叠,直接将当前区间加入结果集中
for(int[] interval : intervals){
if(interval[1] > max){
if(interval[0] <= max){
max = interval[1];
res.get(res.size()-1)[1] = max;
}
else{
max = interval[1];
res.add(interval);
}
}
}
//遍历列表
int idx = 0;
int[][] resArray = new int[res.size()][2];
for(int[] row : res){
resArray[idx++] = row;
}
return resArray;
}
}