leetcode区间部分笔记

区间部分

  • 1. 汇总区间
  • 2. 合并区间
  • 3. 插入区间
  • 4. 用最少数量的箭引爆气球

1. 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。

返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。

列表中的每个区间范围 [a,b] 应该按如下格式输出:
在这里插入图片描述
解题思路: 遍历数组,用i记开头,用j记结尾。看看当前元素位置+1的数和当前元素+1的数是不是相同,如果相同则说明是连续的,就让j++即可,如果不连续,判断开头和结尾是不是一样的,如果是一样的,则说明他就是单个,直接放入list,如果不连续,则按规定,加个箭头 i -> j。然后让j继续++,让i = j的位置。重启另一个开头
此外,需要判断一下最后一个值,因为上面有个判断条件,是当前元素位置+1的数和当前元素+1的数是不是相同,最后一个元素不能这么用,所以得另外写,同样看看i和j是不是相等,如果相等则单个,如果不相等,就写i ——> j

class Solution {
    public List<String> summaryRanges(int[] nums) {
        int i = 0;
        int j = 0;
        List<String> list = new ArrayList<String>();
        while(j < nums.length-1){
            if(nums[j+1] == nums[j] + 1){
                j++;
            }else{
                if(j == i){
                    list.add(String.valueOf(nums[i]));
                }else{
                    list.add(nums[i] + "->" + nums[j]);
                }
                j++;
                i = j;
            }
        }

        if(j == nums.length - 1){
            if(i == j){
                list.add(String.valueOf(nums[i]));
            }else{
                list.add(nums[i] + "->" + nums[j]);
            }
        }
        return list;
    }
}

2. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

在这里插入图片描述
解题思路: 本质是一个n*2的数组,先把第一列排序,注意排序器的写法:Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
然后按行遍历这个数组,判断上一行第二个元素是不是大于等于当前行的第一个的第一个元素,然后判断当前行的第二个元素是否大于等于上一行的第二个元素。有了这两个判断条件,才能让end去更新坐标,也就是记录当前的最大值。
否则,也就是上一行第二个元素是不是小于当前行的第一个的第一个元素,此时就得先记录这个区间,也就是开始行的第一个元素作为头,结束行和最后一个元素作为尾巴。并记录到list集合中。然后更新开始行和结束行。
需要处理一个特殊情况,就是最后一个元素如果是连续的,无法写入到list中,所以需要判断,判断条件就是开始行是不是等于行的总长度,如果不相等则说明没写进去,就把两个元素写进即可
最后用toArray得出结果。

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        List<int[]> merged = new ArrayList<int[]>();
        if(intervals.length == 0){
            return new int[0][2];
        }
        int[] start = {0,0};
        int[] end = {0,1};
        for(int i = 1 ; i < intervals.length; i++){
            if(intervals[i][0] <= intervals[end[0]][end[1]]){
                if(intervals[i][1] >= intervals[end[0]][end[1]]){
                    end[0] = i;
                    end[1] = 1;
                }
            }else{
                int[] res = new int[2];
                res[0] = intervals[start[0]][0];
                res[1] = intervals[end[0]][1];
                merged.add(res);
                start[0] = i;
                end[0] = i;
            }
        }
        if(start[0] != intervals.length ){
            int[] res = new int[2];
                res[0] = intervals[start[0]][0];
                res[1] = intervals[end[0]][1];
                merged.add(res);
        }
        return merged.toArray(new int[merged.size()][]);
    }
}

3. 插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals。

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

在这里插入图片描述
解题思路: 用上面合并区间的思路,只需要把要插入的区间插入到一个新数组中,然后执行刚才的区间合并的方法,就可以得到最终结论。 注意用法 拷贝一个数组
int[][] re = Arrays.copyOf(intervals,指定长度)。

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        List<int[]> merged = new ArrayList<int[]>();
        if(intervals.length == 0){
            return new int[0][2];
        }
        int[] start = {0,0};
        int[] end = {0,1};
        for(int i = 1 ; i < intervals.length; i++){
            if(intervals[i][0] <= intervals[end[0]][end[1]]){
                if(intervals[i][1] >= intervals[end[0]][end[1]]){
                    end[0] = i;
                    end[1] = 1;
                }
            }else{
                int[] res = new int[2];
                res[0] = intervals[start[0]][0];
                res[1] = intervals[end[0]][1];
                merged.add(res);
                start[0] = i;
                end[0] = i;
            }
        }
        if(start[0] != intervals.length){
            int[] res = new int[2];
                res[0] = intervals[start[0]][0];
                res[1] = intervals[end[0]][1];
                merged.add(res);
        }
        return merged.toArray(new int[merged.size()][]);
    }
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int[][] re = Arrays.copyOf(intervals,intervals.length + 1);
        re[intervals.length] = newInterval;
        return merge(re);
    }
}

4. 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。

在这里插入图片描述
解题思路: 本质就是找重合区间的最小重合区间,然后看看有多少个最小重合区间。
首先按第一列数字排序。
按行遍历整个数组,第一列取最大值,记录最小重合区间,判断最小重合区间的最大值是否大于等于当前行的最小值,如果大于了则说明该行在最小区间内,则进行最小区间计算,区间最小值取两数最大,区间最大值取两数最小。
否则,则说明这个最小区间没办法覆盖这一行区间,则记录一次最小区间,再继续执行。
特殊情况,遍历到最后一个,如果是连续最小区间,则没办法添加,如果不是连续最小区间,也没办法添加,所以需要再多添加一个x。
最后返回 list,size()。

class Solution {
    // 找最小重合度
    public int findMinArrowShots(int[][] points) {
        List<int[]> res = new ArrayList<int[]>();
        Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));
        int[] x = points[0];
        for(int i = 1 ;i < points.length; i++){
            if(x[1] >= points[i][0]){
                x[0] = Math.max(x[0],points[i][0]);
                x[1] = Math.min(x[1],points[i][1]);
            }else{
                res.add(x);
                x = points[i]; 
            }
        }
            res.add(x);
        return res.size();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938245.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring学习(spring-bean实例化(静态工厂))

目录 一、spring容器实例化bean的几种方式。 二、spring容器使用静态工厂方式实现bean实例化。 &#xff08;1&#xff09;基本介绍。 1、静态工厂&#xff1f; 2、"factory-method"属性。 3、二种操作方式。 方法一。 方法二。 &#xff08;2&#xff09;demo(案例)…

25年宁德时代社招在职晋升Verify测评SHL题库:语言理解+数字推理考什么?

宁德时代的社招测评采用Verify系统&#xff0c;主要分为两大核心部分&#xff1a;语言理解和数字推理。 1. **语言理解部分**&#xff1a;包括阅读理解、逻辑填空和语句排序等题型。要求应聘者在17分钟内完成30题&#xff0c;旨在考察应聘者的阅读速度、理解准确性和逻辑性。 …

2024数证杯初赛

计算机取证 请根据计算机检材&#xff0c;回答以下问题&#xff1a;(32个小题&#xff0c;共76分 1.[填空题对计算机镜像进行分析&#xff0c;计算该镜像中ESP分区的SM3值后8位为&#xff1f;&#xff08;答案格式&#xff1a;大写字母与数字组合&#xff0c;如&#xff1a;D…

典型案例 | 旧PC新蜕变!东北师范大学依托麒麟信安云“旧物焕新生”

东北师范大学始建于1946年&#xff0c;坐落于吉林省长春市&#xff0c;是中国共产党在东北地区创建的第一所综合性大学。作为国家“双一流”建设高校&#xff0c;学校高度重视教学改革和科技创新&#xff0c;校园信息化建设工作始终走在前列。基于麒麟信安云&#xff0c;东北师…

项目二十三:电阻测量(需要简单的外围检测电路,将电阻转换为电压)测量100,1k,4.7k,10k,20k的电阻阻值,由数码管显示。要求测试误差 <10%

资料查找&#xff1a; 01 方案选择 使用单片机测量电阻有多种方法&#xff0c;以下是一些常见的方法及其原理&#xff1a; 串联分压法&#xff08;ADC&#xff09; 原理&#xff1a;根据串联电路的分压原理&#xff0c;通过测量已知电阻和待测电阻上的电压&#xff0c;计算出…

ST-Linker V2 烧录器详解说明文档

目录 ST-Linker v2烧录器介绍 STM8烧录口 STM32烧录接口 JTAG烧录接口 ​​​​​​​ ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 ST-Linker v2烧录器介绍 图片中是两种IC芯片的烧录器&#x…

在Centos7上安装MySQL数据库 How to install MySQL on Centos 7

执行以下命令&#xff0c;下载并安装MySQL。 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm && yum -y install mysql57-community-release-el7-10.noarch.rpm && yum install -y mysql-community-server --nogpgcheck执行以下…

FireFox火狐浏览器企业策略禁止更新

一直在用火狐浏览器&#xff0c;但是经常提示更新&#xff0c;进入浏览器右上角就弹出提示&#xff0c;比较烦。多方寻找&#xff0c;一直没有找到合适的方案&#xff0c;毕竟官方没有给出禁用检查更新的选项&#xff0c;甚至about:config里都没有。 最终找到了通过企业策略控…

【Qt】按钮类控件:QPushButton、QRadioButton、QCheckBox、ToolButton

目录 QPushButton 例子&#xff1a; QRadioButton 例子&#xff1a; 按钮的常见信号函数 单选按钮分组 例子&#xff1a; QCheckButton 例子&#xff1a; QToolButton QWidget的常见属性及其功能对于它的派生类控件都是有效的(也就是Qt中的各种控件)&#xff0c;包括…

SpringBoot3 升级介绍

优质博文&#xff1a;IT-BLOG-CN 一、项目背景 截止2023.05.18&#xff0c;springboot发布了最新版本3.1.0。而在我们开发项目中&#xff0c;springboot一直使用的是1.5.8版本(相差6年的维护更新)。版本差距较大&#xff0c;很多新功能未能得到使用。例如近几年Loom的兴起&am…

运筹说 第130期 | 对策论引言

通过对对策论基础知识进行梳理和总结&#xff0c;小编绘制了《对策论思维导图》&#xff0c;如下图所示&#xff0c;对策论章节一共包含4个小节。 第1小节是对策论引言。介绍了对策论的基本概念&#xff0c;包含对策行为和对策论、对策现象的三要素、对策问题举例及对策的分类…

Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令

注&#xff1a;本文为网络命令相关文章合辑。 未整理去重。 一、IPv6 概述 IPv6 即 “Internet 协议版本 6”&#xff0c;因 IPv4 地址资源面临耗尽问题而被引入以替代 IPv4。IPv6 则提供了理论上多达 2 128 2^{128} 2128 个地址&#xff0c;有效解决地址不足困境。 IPv6 具…

密码学——密码学概述、分类、加密技术(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 密码学 大数据…

Android Studio、JDK、AGP、Gradle、kotlin-gradle-plugin 兼容性问题

文章目录 问题&#xff1a;解决办法&#xff1a;gradle与 java的版本兼容AGP与Gradle的版本兼容kotlin 与 jvm 的版本兼容KGP、Gradle、AGP兼容关系kotlin 与 java 的编译版本配置 问题&#xff1a; 你从githb上clone了一个项目&#xff0c;本地跑的时候&#xff0c;各种报错。…

ChatGPT搜索全新升级,向全体用户开放,近屿智能助力AI行业发展

12月17日&#xff0c;OpenAI在第八天直播中正式宣布ChatGPT搜索功能全面升级&#xff0c;并即日起对所有ChatGPT用户开放。此次更新不仅带来了显著的性能提升&#xff0c;还引入了多项突破性功能&#xff0c;如更快的搜索速度、全新的地图体验以及YouTube视频嵌入&#xff0c;为…

VSCode编辑+GCC for ARM交叉编译工具链+CMake构建+OpenOCD调试(基于STM32的标准库/HAL库)

本文以【STM32F103ZET6】单片机作为示例来进行演示&#xff0c;标准库/HAL库的工程是通用的&#xff0c;修改CMakeLists.txt里面的源文件和头文件引用部分即可。 更多细节请参考【VSCode编辑GCC for ARM交叉编译工具链Makefile构建OpenOCD调试&#xff08;基于STM32的标准库&am…

ResNet网络:深度学习中的革命性架构

目录 ​编辑 引言 ResNet网络的特点 1. 残差块&#xff08;Residual Block&#xff09; 2. 恒等映射&#xff08;Identity Mapping&#xff09; 3. 深层网络训练 4. Batch Normalization 5. 全局平均池化 6. 灵活的结构 ResNet的应用案例 ResNet的研究进展 实战案例…

Axure9设置画布固定

在使用AxureRP9设计原型时&#xff0c;如果遇到画布在拖动时变得难以控制&#xff0c;可以尝试在Windows系统中通过‘文件’>‘首选项’&#xff0c;或在Mac系统中通过‘AxureRP9’>‘偏好设置’进行设置&#xff0c;以稳定画布的行为。 现象 页面底层的画布&#xff0…

景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”

近日&#xff0c;由中国信息通信研究院、中国人工智能产业发展联盟牵头&#xff0c;联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业&#xff0c;入选图谱中技术服务板块。…

ESlint代码规范,手动与自动修复

规范说明 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 规范说明 ​ ​ 可看到是main.js文件报错分别是第三行第30个字符&#xff0c;以及第七行第一个字符 后面则是规范说明&#xff0c;可以根据说明查找相应的规范 一.手动修正 ctrl f 可以搜索 二.自动修正 …