这个题目,关键是需要先排序,要不难度就大了,因为存在排序,所以瓶颈主要是排序的耗时,因为排序的时间复杂度平均为o(nlongn),但是排序以后,一次for循环就结束了。
Java里面对这个排序,可以通过sort去处理这个二维数组。
// 这个就是按照左边的元素对数组排序 Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
整体代码如下:
package com.codeking.lc;
import java.util.Arrays;
import java.util.Comparator;
/**
* @author xiongjl
* @since 2023/8/4 21:33
*/
public class lc56 {
public static void main(String[] args) {
int[][] merge = new lc56().merge(new int[][]{{1, 3}, {2, 6}, {8, 10}, {15, 18}});
System.out.println(Arrays.deepToString(merge));
}
public int[][] merge(int[][] intervals) {
if (intervals.length == 1) {
return intervals;
}
// 这个用法是从小到大排法
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
//Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int[][] res = new int[intervals.length][2];
int l = intervals[0][0], r = intervals[0][1];
int k = 0;
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] <= r) {
r = Math.max(r, intervals[i][1]);
} else {
res[k++] = new int[]{l, r};
l = intervals[i][0];
r = intervals[i][1];
}
if (i == intervals.length - 1) {
res[k] = new int[]{l, r};
}
}
int[][] ints = new int[k + 1][2];
for (int i = 0; i < k + 1; i++) {
ints[i] = res[i];
}
//System.arraycopy(res, 0, ints, 0, k + 1);
return ints;
}
}