题目
重写比较器用来排序,然后就也是比较两个相邻数组,最终是list转化为int[][]
class Solution {
public int[][] merge(int[][] intervals) {
if(intervals.length==0) return new int[0][];
Comparator<int[]> cmp = new Comparator<>(){
public int compare(int[] a,int[] b){
if(a[0]!=b[0]){
return a[0]-b[0];
}else{
return a[1]-b[1];
}
}
};
Arrays.sort(intervals,cmp);
List<int[]> list = new ArrayList<>();
for(int i=0;i<intervals.length-1;i++){
if(intervals[i][1]>=intervals[i+1][0]){
intervals[i+1][0] = intervals[i][0];
intervals[i+1][1] = intervals[i][1]>intervals[i+1][1]?intervals[i][1]:intervals[i+1][1];
}else{
list.add(intervals[i]);
}
}
list.add(intervals[intervals.length-1]);
return list.toArray(new int[0][]);
}
}
一定要好好记住如何写这个比较器,很重要
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> res = new ArrayList<>();
Arrays.sort(intervals, new Comparator<>(){
public int compare(int[] o1, int[] o2){
return o1[0] - o2[0];
}
});
int left = 0;
int right = 0;
while(right < intervals.length){
int leftBound = intervals[left][0];
int rightBound = intervals[right][1];
while(right < intervals.length && intervals[right][0] <= rightBound){
rightBound = Math.max(intervals[right][1],rightBound);
right++;
}
res.add(new int[]{leftBound,rightBound});
left = right;
}
int[][] num = new int[res.size()][2];
for(int i = 0; i < res.size(); i++){
num[i][0] = res.get(i)[0];
num[i][1] = res.get(i)[1];
}
return num;
}
}
仔细的看一下这道题和57题,感觉核心是一样的。
本质都是重新排序数组之后,合并存在重叠的区间。
这道题采用的就是遍历数组的方式操作,下道题采用的是栈的方式合并(比较容易想到)。