今天早上又来二刷,思路还是有点偏离,双指针只想存放当前需要存放的数组边界。
但是看了答案后发现,其实准备存放的数组可以直接存在List中,如果列表为空,或者当前区间与上一区间不重合,直接添加,否则就更新区间的边界。
这里可以关注2个按数组首个元素排序的不同写法:
Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
如果前面申请的是数组List类型的ans,那最后还要把ans转成二维数组格式:
merged.toArray(new int[merged.size()][]);
还有另外一种解法,更贴近我的思路,这里也贴上来参考:
public static int[][] merge(int[][] intervals) {
if(intervals.length == 0){
return new int[][]{};
}
Arrays.sort(intervals,(a,b)->{return a[0]-b[0];});
int[][] res = new int[intervals.length][2];
int index = 0;
int start =intervals[0][0],end = intervals[0][1];
//下一个数组的起始值必须要小于上一个数组的最大值才能合并
for(int i = 1; i <intervals.length ; i++){
//如果当前最小界比上一个的最大界小 说明可以合并 ,更新更新后的上界
if(intervals[i][0]<=end){
end = Math.max(intervals[i][1], end);
}else {
//说明不能继续合并了 ,把之前合并的结果存入结果集中
res[index][0] = start;
res[index][1] = end;
index++;
//更新start 和 end 为当前新范围
start = intervals[i][0];
end = intervals[i][1];
}
}
res[index][0] = start;
res[index][1] = end;
return Arrays.copyOfRange(res, 0, index+1);
}
网友评论