本题中可以学到的比较重要的方法
lambda表达式定义自定义比较器Comparator
Arrays.sort(intervals,(v0,v1)->{
return v0[0] - v1[0];
});
(附 : 这种形式也适合于优先队列创建时的自定义比较器定义)
比如:
PriorityQueue<Integer> minTop = new PriorityQueue<>(k , (Integer a,Integer b ) - > { return a - b ;
});
当然了,本身优先队列里的对象如果是包装数据类型的话,就是升序的,这里只是举个例子。
如果需要根据比较的元素来倒序排序,只需要return b - a
Arrays.copyOf
我们定义的res的长度是以intervals的长度来的,但是仅限全部区间不合并的情况下,这个长度才是正确的,否则一定会出现[0,0]的元素,所以我们要用Index的长度来限制返回的数组长度。这时候需要用copyOf的方法来快捷切割长度,并复制整个数组。
(index + 1)的原因是,index为0时,代表数组中有一个元素,长度总是比index大一个单位。
思路
先看什么时候不合并吧,首先第一个区间入队的时候,肯定不合并。然后如果下一个区间的首部位置大于了现存的最后一个区间的尾部位置,那肯定也合并不了。
如果发现下一个区间的首部位置小于了 现存的最后一个区间的尾部位置,说明两个区间发生了重叠,必然可以合并,合并后,首部不变,尾部变为尾部位置数值较大的那个区间的尾部。
class Solution {
public int[][] merge(int[][] intervals) {
Arrays.sort(intervals,(v0,v1)->{
return v0[0] - v1[0];
});
int[][] res = new int[intervals.length][2];
int index = -1;
//定义res的index
for(int[] interval : intervals){
if(index == -1 || interval[0] > res[index][1]){
res[++index] = interval;
}
else{
res[index][1] = Math.max(res[index][1],interval[1]);
}
}
return Arrays.copyOf(res,index+1);
}
}