【LeetCode题解】56. 合并区间

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

示例 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] 可被视为重叠区间。

题解:


  1. 当区间按序排列时,如果用 [ left , right ]表示当前需要整合的区间,则 [ left , right ]需满足:① left 是当前最小的  ② right 必须小于下一个集合的 next-left。
  2. 依据这个思路:① left 按序取,且若保存一个已整合的 [ left , right ],left 指向下一个集合的 next-left  即可  ② right需要和下一个集合的next-left 比较,如小于,整合当前,若大于,则更换为next-right 继续下一轮循环
  3. 但是提交后11 / 169 个通过测试用例,一看区间是非按序排列:输入:[[1,4],[0,4]] ,所以需要手动将它们排序,但是二维数组无法直接排序,所以手动分为lefts左集合和rights右集合,等同于构建有序排列的区间集合即可用上述方法
  4. class Solution {
        public int[][] merge(int[][] intervals) {
            if(intervals.length == 0)
                return intervals;
            //lefts左集合和rights右集合,然后排序
            int[] lefts = new int[intervals.length];
            int[] rights = new int[intervals.length];
            for(int i=0 ; iright){
                    //无须整合直接录入 如:[2,6] [8,10]
                    intervals[index++] = new int[]{left,right};
                    left = lefts[i];
                }
                //需整合,则更换为next-right 继续下一轮循环
                right = rights[i];
                
                if(i == intervals.length -1){
                    //尾结点,直接纳入集合
                    intervals[index] = new int[]{left,right};
                }
            }
            int[][] ret = new int[index+1][2];
            System.arraycopy(intervals,0,ret,0,index+1);
            return ret;
            
        }
    }

     

 

你可能感兴趣的:(LeetCode题解)