• 【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
  • 相关阅读:
    【区块链实战】什么是智能合约,如何搭建智能合约环境
    Promise常用方法笔记
    [Linux]如何配置定期任務腳本,並將執行結果寄到外部郵箱? (上)
    salesforce零基础学习(一百二十六) Picklist Value Set 优缺点和使用探讨
    QUIC协议报文解析(三)
    软件测试行业35岁职场魔咒,你准备怎么应对?
    小白学Go 基础02-了解Go语言的诞生与演进
    【Web前端入门】CSS知识详解——附源码
    3.7背景色半透明
    微软开源 windows-drivers-rs, 用 Rust 开发 Windows 驱动程序
  • 原文地址:https://blog.csdn.net/qq_46656857/article/details/133174156