56. 合并区间

88 阅读1分钟

思路

  • 需要先按照区间头部大小排序,处理[[2,3],[4,5],[6,7],[8,9],[1,10]]这种情况。
  • 两个相邻区间合并。
    • 合并时,interval[i] 与 interval[i + 1]有以下三种关系:
  • 关键:合并完成后,怎么把新的interval[i]加到intervals中
    • 可以使用arraycopy,把左侧和右侧copy到新的interval中,但是这样开销太大。
    • 因此使用res来记录已经操作完的区间,一开始,intervals[1]res[0]比较,res[0] = intervals[0]
class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]); //需要先按照区间头部大小排序
        int[][] res = new int[intervals.length][2];//用这个数组存已经扫过的元素
        res[0] = intervals[0];//先放进去第一个数组,intervals[i] 和 res[0]比
        int j = 0; // 结果里放进多少个了
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] > res[j][1]) {//【A】,res[j]不能合并了
                j++;
                res[j] = intervals[i];
            } else if (intervals[i][0] <= res[j][1] && intervals[i][1] >= res[j][1]) {//【B】,res[j]还能合并
                res[j] = new int[]{res[j][0], intervals[i][1]};
            } else if (intervals[i][0] <= res[j][1] && intervals[i][1] <= res[j][1]) {//【C】
                // res[j] = new int[]{res[j][0], res[j][1]};
            }
        }
        // 一开始初始化interval.length长,需要截取index为 0~j的数组
        return Arrays.copyOf(res, j + 1); 

    }
}