难度:中等
频次:83
题目
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间
解题思路: 用排序辅助判断前后元素是否有交集即可
注意:
- 排序用了Arrays类自带的静态函数sort,并且借助了lambda表达式(v1,v2)-> v1[0]-v2[0])
- 用k计数新的res里一共有多少个元素
- 迭代用 for(int[] interval:intervals)
- 用res的最后一个元素跟interval判断是否有交集
- 特殊情况,当res里没有元素的时候,用k==0判断,并且没有元素直接添加即可 - 最后要截取res的前k个,否则会有[0,0],因为一开始就初始化跟intervals一样长 。Arrays.copyOfRange(res,0,k) 不包括下标为k的元素
代码
class Solution {
public int[][] merge(int[][] intervals) {
int n=intervals.length;
int[][] res=new int[n][2];
//做排序 借助 compartor lambda表达式
Arrays.sort(intervals,(v1,v2)-> v1[0]-v2[0]);
//计数,表示目前res中有几个元素
int k=0;
//迭代
for(int[] interval:intervals){
//因为第一次的时候,res还没有元素,所以用k==0进入第一次
//只要第一个数字比之前的第二个数字大,就说明没有交集,那么直接添加新元素就行了
if(k==0||interval[0]>res[k-1][1]){
//k的位置跟用K时有影响,K++不能忘记
k++;
res[k-1]=interval;
}
//有交集的时候,比较第二个数谁大。修改res[k-1][1]就行了,不用添加新的
else{
res[k-1][1]=Math.max(res[k-1][1],interval[1]);
}
}
//如果截断到k,那么res会返回n个元素,并且后面有部分为[0,0];
return Arrays.copyOfRange(res,0,k);
}
}