leetcode 力扣 56 合并区间

87 阅读1分钟

intervals = [[1,3],[2,6],[8,10],[15,18]]
在上面的数组中,观察[1,3],[2,6]1小于22小于3,并且6大于3,所以[1,3],[2,6]可以合并成[1,6]

intervals = [[1,4],[2,3]]
在上面的数组中,1小于223均小于4,所以可以合并成[1,4]

如果对intervals进行排序,首数字小的排在前面,则只需要比较[startistart_i, endiend_i], [startjstart_j, endjend_j]中的endiend_istartjstart_j,以及已合并数组中,最后一个数组的endiend_i和当前遍历数组中的endjend_j

public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a1, a2) -> a1[0] - a2[0]);

        int len = intervals.length;
        int[][] res = new int[len][2];

        int idx = -1;

        for (int[] interval : intervals) {
            if (idx == -1 || res[idx][1] < interval[0]) {
                res[++idx] = interval;
            } else {
                res[idx][1] = Math.max(res[idx][1], interval[1]);
            }
        }

        return Arrays.copyOf(res, idx + 1);
    }

不能用for(int i = 0; i < len; i++)遍历intervals,因为必须用idx表示已经合并的子数组的下标