Leetcode-56. 合并区间

473 阅读1分钟

给出一个区间的集合,请合并所有重叠的区间。

示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

链接:leetcode-cn.com/problems/me…

思路: 不知道输入的区间的顺序(是否是递增的),需要先进行排序,保证左区间是递增的,这样可以保证相邻的区间可以判断是否是相交的。如图。只要后一个的左区间小于前一个的右区间,那么一定是相交的,合并之后的右区间是两者右区间的最大值。

    public static int[][] merge(int[][] intervals) {
        // 先对数组排序 
        Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
        
        // 创建一个临时的数组,用来保存合并之后的新区间
        int[][] data = new int[intervals.length][2];
        
        //初始值为第一区间
        data[0] = intervals[0];
        int index = 0;
        for (int[] interval : intervals) {
            // 如果左区间的值是大于现有的右区间的值,表示已经不是相交的,直接放进数组,最为比较的值
            if (data[index][1] < interval[0]) {
                data[++index] = interval;
            } else {
                data[index][1] = Math.max(data[index][1], interval[1]);
            }
        }
        // 根据合并之后的值,取出有效值。
        return Arrays.copyOf(data, index + 1);


    }