• 【LeetCode热题100】--56.合并区间


    56.合并区间

    image-20230922153001176

    排序:
    如果按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的,如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并为一个大区间,它们在排完序的列表中是连续的

    image-20230922153201993

    算法:

    使用数组merged存储最终的答案

    首先,将列表中的区间按照左端点升序排序,然后我们将第一个区间加入merged数组中,并按顺序依次考虑之后的每个区间:

    • 如果当前区间的左端点在数组merged中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组merged的末尾
    • 否则,它们重合,需要用当前区间的右端点更新数组merged中最后一个区间的右端点,将其设置二者的较大值
    class Solution {
        public int[][] merge(int[][] intervals) {
            if(intervals.length == 0){
                return new int[0][2];
            }
            Arrays.sort(intervals,new Comparator<int[]>() {
                public int compare(int[] interval1,int[] interval2){
                    return interval1[0] - interval2[0];
                }
            });
            List<int[]> merged = new ArrayList<int[]>();
            for(int i= 0;i<intervals.length;i++){
                int L = intervals[i][0],R = intervals[i][1];
                if(merged.size() == 0 || merged.get(merged.size()-1)[1] < L){
                    merged.add(new int[]{L,R});
                }else{
                    merged.get(merged.size() -1 )[1] = Math.max(merged.get(merged.size()-1)[1],R);
                }
            }
            return merged.toArray(new int[merged.size()][]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    方法二:

    class Solution {
        public int[][] merge(int[][] intervals) {
            List<int[]> res = new ArrayList<>();
            if(intervals.length == 0){
                return res.toArray(new int[0][]);
            }
            //对起点终点进行排序
            Arrays.sort(intervals,(a,b) -> a[0]-b[0]);
            int i = 0;
            while(i < intervals.length){
                int left = intervals[i][0];
                int right = intervals[i][1];
                //如果有重叠,循环判断哪个起点满足条件
                while(i<intervals.length - 1 && intervals[i + 1][0] <= right){
                    i++;
                    right = Math.max(right,intervals[i][1]);
                }
                //将现在的结果放在res中
                res.add(new int[]{left,right});
                //进行判断下一个区间
                i++;
            }
            return res.toArray(new int[0][]);  //将ArrayList转变为数组
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    最新Java面试题,常见面试题及答案汇总
    关于 在国产麒麟系统上使用QProcess配合管道命令执行shell命令获取预期结果输出失败 的解决方法
    【蓝桥】健身
    redis(普通连接和连接池、字符串类型、hash类型、列表类型)
    halcon-基础部分
    【pandas小技巧】--字符串转数值
    面试题------线程池的拒绝策略
    【408专项篇】C语言笔记-第五章(一维数组与字符数组)
    c语言练习76: 找出中枢整数
    Word制作生成html模板替换动态值为占位符使用Java转为pdf文件
  • 原文地址:https://blog.csdn.net/qq_46656857/article/details/133174156