LeetCode(056)-Merge Intervals(优先级队列解决O(n))

版权声明:中华人民共和国持有版权 https://blog.csdn.net/Fly_Fly_Zhang/article/details/89886888

题目:

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

翻译:

给定一组区间,合并所有重叠的区间。
示例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]被认为是重叠的。
注:输入类型已于2019年4月15日更改。请重置为默认代码定义以获得新方法签名。

思路:

本题主要借助优先级队列先对每一个范围进行排序,确保后面的大于前面的。然后分析相邻两个数组的范围,是交叉还是不交叉,不交叉直接装进新数组。交叉的进行左右边界范围判断,确定最大左右边界。由此循环直到取出优先级队列中所有元素。

class Solution {
    public int[][] merge(int[][] intervals) {
        if(intervals.length<2){ 
            return intervals;
        }
        //转化成优先级队列进行排序
        PriorityQueue<int[]> queue=new PriorityQueue(new Comparator<int[]>(){
            @Override
            public int compare(int[] num1,int [] num2){
                return num1[0]-num2[0];
            }
        });
        //将二维数组转化成一维数组存进优先级队列
        for(int i=0 ; i < intervals.length ; i++){
            queue.add(intervals[i]);
        }
        int left=0;
        int right=0;
        
        if(!queue.isEmpty()){
            int[] num=queue.remove();
            left=num[0];
            right=num[1];
        }
        List<int[]> list=new ArrayList();
        //经过优先级队列排序,一维数组已经按照从小到达排序
        while(!queue.isEmpty()){
            int[] num=queue.remove();//得到左边界最小的一维数组。
            int l=num[0];
            int r=num[1];
            if(right<l){ //两个范围不重合直接存储
                list.add(new int[]{left,right});
                left=l;
                right=r;
            }else if(l<=right){ //交叉
                //我们优先级队列采用的是左边界排序(从小到大)
                // if(l<left){ //确定左边界
                //   left=l;
                // }
                if(r>right){ //确定右边界
                  right=r;
                }
            }
        }
        list.add(new int[]{left,right}); //最后一组存进去;
        int[][] num=new int[list.size()][2];
        //集合转化成数组;
        for(int j=0 ; j< list.size() ;j++){ 
            int[] tmp= list.get(j);
            num[j][0]=tmp[0];
            num[j][1]=tmp[1];
        }
        return num;
    }
}

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/89886888