Leetcode56.合并区间——善用排序与数据结构

2023-10-27

文章目录

引入

该题是这样的

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

该题的输入是int[][]的二维数组intervals,其intervals.length就是区间的长度,intervals[0].length长度是2,即表示区间的开始和结束。

首先拿到这道题的时候,需要去充分理解什么样子的区间才能够合并,显然就是后一个区间的开始要小于等于前一个区间的结束,比如[1,3],[2,4],2<3,所以可以合并。并且,合并后的结果就是[1,4]。但是如果是[1,3]和[2,2],其合并结果是[1,3]。也就是后面一个结果,取决于两者比较后的大小。

理解到这点后,还需要考虑,如果出现3个以上的区间都能够合并,它的情况是什么样子的?比如,[1,4],[2,3],[3,5],其合并的结果与先合并[1,4],[2,3]再合并[3,5]的结果是相同的。

题解

所以,首先,需要把该序列,进行一个排序,由于排序的是二维数组,我们可以用Java8的Lambda表达式进行排序(重写Comparator接口里面的compare方法,用Lambda表达式写比较简洁)。

Arrays.sort(intervals,(o1,o2)->o1[0]-o2[0]);

那么,我们现在需要对区间进行一个类似于栈的存取。这里可以使用栈、可以使用LinkedList或者ArrayList,都不妨碍。只不过用栈的时候,输出需要从后往前排列。
由于区间是成对出现的,我们需要有一个新的类来存储它,这里我们是这样写的:

    class Interval{
        public int x;
        public int y;
        public Interval(int x,int y){
            this.x=x;
            this.y=y;
        }
    }

现在,只需要对数组进行出栈和入栈的类似操作即可:

class Solution {
    class Interval{
        public int x;
        public int y;
        public Interval(int x,int y){
            this.x=x;
            this.y=y;
        }
    }
    public int[][] merge(int[][] intervals) {
        //二维数组排序
        Arrays.sort(intervals,(o1,o2)->o1[0]-o2[0]);
        List<Interval> merged=new ArrayList<Interval>();
        for(int i=0;i<intervals.length;i++){
            int size=merged.size();
            if(size==0||merged.get(size-1).y<intervals[i][0]){
                //不能合并,加入新元素
                merged.add(new Interval(intervals[i][0],intervals[i][1]));
            }else{
                //合并
                Interval curr=merged.get(size-1);
                int bigger=intervals[i][1]>curr.y?intervals[i][1]:curr.y;
                merged.set(size-1,new Interval(curr.x,bigger));
            }
        }
        int[][] output=new int[merged.size()][2];
        for(int i=0;i<merged.size();i++){
            output[i][0]=merged.get(i).x;
            output[i][1]=merged.get(i).y;
        }
        return output;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode56.合并区间——善用排序与数据结构 的相关文章

随机推荐

  • 1603A - Di-visible Confusion

    1603A Di visible Confusion 题目 一个长度为N的数组从a1 a2 an 如果在存在不能被整除则可以删除 剩下的数变为a1 a2 an 1 求是否能使得数组为空 题解 每个数都会因为前一个数被删除而前移 所以遍历所有
  • 微信小程序如何实现将数据导出生成excel

    码字不易 有帮助的同学希望能关注一下我的微信公众号 Code程序人生 感谢 代码自用自取 这个需求也是我在接私活的时候遇到的 需求就是 要实现将指定数据库表的数据全部导出生成excel和按需导出 也就是导出全部数据 或者导出指定哪天的数据
  • Package opencv was not found in the pkg-config search path.

    安装好后opencv后执行下面这条语句的时候出错 pkg config cflags opencv Package opencv was not found in the pkg config search path Perhaps you
  • Git创建远程分支并提交代码到远程分支

    1 可以通过git branch r 命令查看远端库的分支情况 动图演示 选择项目右键选择 Git Bash Here 然后输入命令git branch r 2 从已有的分支创建新的分支 如从master分支 创建一个dev分支 但此时并没
  • 如何把itunes中的语音备忘录导出来

    2012 4 18 以前我把手机上的语音备忘录导出到itunes中 现在我想把在itunes中的语音备忘录导出来 如何导 己找到解决办法了 在语音备忘录中的语音文件 右键 选择 在资源管理其中显示
  • VSCode 结合Makefile设置调试方法

    添加构建 编译 链接等 任务 tasks json ctrl shift p打开命令行 输入Tasks Run task Create tasks json file from template 生成默认的tasks json文件 See
  • pythonturtle填充颜色函数_python turtle库颜色填充-绘制心形

    颜色填充函数 使用Turtle不仅可以画线条 也可以将画出的封闭线条进行填充 开始填充 begin fill 设定填充色 fillecolor 结束填充 end fill 实际操作 练习1 画心形import turtle import r
  • matlab中列平方求和公式,matlab求两列数据的平方和

    matlab怎样求矩阵每一行的平方和 有矩阵a则你所要求的矩阵b sum a a 2 附 这是点乘 就是矩阵每个对应位置的元素相乘sum a 2 是按行相加 得出的为列向量若sum a 是按列相加 得出的为行向量 基于matlab的数据正态
  • C语言的强制类型转换本质是什么?

    数据在计算机中是如何存储的 程序最终是要在计算机中运行的 中间产生的数据会暂存在内存 寄存器 cache中 也可以写到硬盘中保存起来 对计算机而言 数据没有什么变量类型 int char等 的区别 以字节为单位 计算机里存在的不是0就是1
  • AES128/ECB/PKCS5Padding 的实现

    AES的相关基础知识直接看WikiPedia 高级加密标准 附上 C C 可用代码 AES Cipher
  • 第15届全国大学生知识竞赛 2022ciscn初赛 部分wp

    Misc ez usb 1 键盘流量 USB协议数据部分在Leftover Capture Data域中 数据长度为八个字节 其中键盘击键信息集中在第三个字节中 如图 发现击键信息为0x06 即对应的按键为C 2 鼠标流量 USB协议鼠标数
  • Quoit Design (白话--分治--平面点对问题)

    Quoit Design Problem Description Have you ever played quoit in a playground Quoit is a game in which flat rings are pitc
  • php 获取图片的宽高,js如何获取图片宽高

    js获取图片宽高的方法 1 onload后在打印 2 通过complete与onload一起混合使用 3 通过定时循环检测获取 代码为 from check width img width height img heig 本教程操作环境 w
  • 二十天入门Java系列:第一天

    文章目录 第一天 01 01 计算机基础知识 计算机概述 了解 01 02 计算机基础知识 软件开发和计算机语言概述 了解 01 03 计算机基础知识 人机交互 了解 01 04 计算机基础知识 键盘功能键和快捷键 掌握 01 05 计算机
  • FPGA查找表

    一 查找表 Look Up Table 的原理与结构 采用这种结构的PLD芯片我们也可以称之为FPGA 如altera的ACEX APEX系列 xilinx的Spartan Virtex系列等 查找表 Look Up Table 简称为LU
  • 任意整数从0-x累加的巧妙算法

    巧妙的累加算法 include
  • 【实验七】【使用规则实现数据完整性】

    文章目录 数据完整性 约束的形式 规则与默认值的SQL语句 一 创建一个关于开课学期的规则 二 创建一个关于性别的规则 三 创建一个关于学分的规则 总结 Reference 数据完整性 约束的形式 下边通过一个总体说明约束怎样保证数据完整性
  • 利用CDN加速react webpack打包后的文件

    此文不介绍webpack基本配置 如果对基本配置有疑问请查阅官方文档 1 配置webpack config js 将output publicPath改成上传到的cdn地址 例 对应上面上传配置 publicPath https your
  • vue 数据代理和数据监测

    vue 数据代理和数据监测 数据代理和数据监测是vue 里面一个很重要的概念 但是他们在vue中扮演什么角色 了解这些前得先了解 数据代理和数据监测的概念 vue中双向绑定 v model和v bind 指令都能将模型数据反应到页面 而且每
  • Leetcode56.合并区间——善用排序与数据结构

    文章目录 引入 题解 引入 该题是这样的 56 合并区间 给出一个区间的集合 请合并所有重叠的区间 示例 1 输入 1 3 2 6 8 10 15 18 输出 1 6 8 10 15 18 解释 区间 1 3 和 2 6 重叠 将它们合并为