题目描述

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

示例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.我们可以以二维数组的第一个元素为基准,进行快速排序,整理好二维数组。
2.然后以两个元素为一对遍历整个二维数组,判断二者是否应该被合并。
3.这里为了操作方便,使用ArrayList存储数组。

Java代码实现

    public int[][] merge(int[][] intervals) {
        List<int[]> arrays = new ArrayList<>();
        for (int i = 0; i < intervals.length; i++) {
            arrays.add(intervals[i]);
        }

        quickSortArrays(arrays,0,arrays.size()-1);

        for (int i = 0; i < arrays.size()-1;) {
            int[] pre = arrays.get(i);
            int[] after = arrays.get(i+1);

            //如果after是pre的子集
            if(pre[1]>=after[1]){
                arrays.remove(i+1);
                continue;
            }

            //如果pre应该和after合并
            if(pre[1]>=after[0] && pre[1]<=after[1]){
                int[] nums = new int[]{pre[0],after[1]};
                arrays.remove(i);
                arrays.remove(i);
                arrays.add(i,nums);
                continue;
            }

            i++;
        }

        int[][] res = new int[arrays.size()][2];

        for (int i = 0; i < arrays.size(); i++) {
            res[i] = arrays.get(i);
        }

        return res;
    }


    private void quickSortArrays(List<int[]> arrays,int left,int right){
        if(left >= right)
            return;
        int pos = partitionArray(arrays,left,right);
        quickSortArrays(arrays,left,pos-1);
        quickSortArrays(arrays,pos+1,right);
    }

    private int partitionArray(List<int[]> arrays,int left,int right){
        int low = left;
        int high = right+1;
        int[]  startArray = arrays.get(left);
        while(low<high){
            while(low<right && arrays.get(++low)[0]<=startArray[0]);
            while(high>left && arrays.get(--high)[0]>=startArray[0]);
            if(low<high){
                Collections.swap(arrays,low,high);
            }
        }
        Collections.swap(arrays,left,high);
        return high;
    }