当前位置: 首页 > news >正文

Java - LeetCode面试经典150题 - 区间 (三)

区间

228. 汇总区间

题目

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

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

列表中的每个区间范围 [a,b] 应该按如下格式输出:

"a->b" ,如果 a != b

"a" ,如果 a == b

提示:

0 <= nums.length <= 20

-2^31 <= nums[i] <= 2^31 - 1

nums 中的所有值都 互不相同

nums 按升序排列

示例 1:
输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
解释:区间范围是:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"
示例 2:
输入:nums = [0,2,3,4,6,8,9]
输出:["0","2->4","6","8->9"]
解释:区间范围是:
[0,0] --> "0"
[2,4] --> "2->4"
[6,6] --> "6"
[8,9] --> "8->9"
解析:

因为是有序数组,直接按照题意模拟即可。

遍历数组,连续则继续;不连续就断开,记录。

代码:
class Solution {public List<String> summaryRanges(int[] nums) {int n=nums.length;boolean flag=false;int l=-1,r=-1;ArrayList<String> ans = new ArrayList<>();for (int i=0;i<n;i++){if (!flag) {l=nums[i];r=l;flag=true;}else{if (nums[i]==nums[i-1]+1){r=nums[i];}else{if (l==r) ans.add(r+"");else ans.add(l+"->"+r);i--;flag=false;}}}if (flag) {if (l==r) ans.add(r+"");else ans.add(l+"->"+r);}return ans;}
}

56. 合并区间

题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。

请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

提示:

1 <= intervals.length <= 1e4

intervals[i].length == 2

0 <= starti <= endi <= 1e4

示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
解析:

首先先对二维数组进行排序,按照左端点从小到大排序;

之后,就是判断上个区间的右端点和下个区间的左端点是否能接上,能接上就说明是同一个区间的,继续遍历;否则就断开,将上个区间的左端点和右端点记录在答案中;

之后就是处理其他问题,如判断最后的一块区间是否已经在答案中,答案的格式转化等。

代码:
class Solution {public int[][] merge(int[][] intervals) {int n=intervals.length;Arrays.sort(intervals,(a,b)->{if (a[0]!=b[0]) return a[0]-b[0];return a[1]-b[1];});int l=-1,r=-1,l1=-1,r1=-1;ArrayList<List<Integer>> res = new ArrayList<>();for (int i=0;i<n;i++){int a=intervals[i][0],b=intervals[i][1];if (r<a){if (l==-1){l=a;r=b;}else{res.add(List.of(l,r));l1=l;r1=r;l=a;r=b;}}else {r=Math.max(r,b);}}if (r1!=r){res.add(List.of(l,r));}int[][] ans= new int[res.size()][];for (int i=0;i<res.size();i++){var k=res.get(i);ans[i]=new int[k.size()];for (int j=0;j<k.size();j++){ans[i][j]=k.get(j);}}
//        for (int i=0;i<res.size();i++){
//            for (int j=0;j<2;j++) System.out.print(ans[i][j]+" ");
//            System.out.println();
//        }return ans;}
}

57. 插入区间

题目

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

同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

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

返回插入之后的 intervals。

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

提示:

0 <= intervals.length <= 1e4

intervals[i].length == 2

0 <= starti <= endi <= 1e5

intervals 根据 starti 按 升序 排列

newInterval.length == 2

0 <= start <= end <= 1e5

示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
解析:

因为这个一个按照左端点从小到大排序好的数组,所以不需要我们排序了。

遍历数组,一共就3种情况。假设newInterval的值是l和r。

遍历数组时,数组的右端点小于l,说明数组第i区间与[l,r]无重叠;

之后,可能会出现l>intervals[i][1]的情况,根据这种情况,有判断好几种可能性,部分重叠,完全覆盖,不重叠。但是有一个共同特点,如果有覆盖的地方,那么r一定在第i区间的左端点的右边(可以相等)!!此时判断一下,判断成功就更新l和r,继续遍历;

直到r小于一个区间的左端点,此时后续的空间就跟[l,r]无关了。

代码:
class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {List<int[]> ans = new ArrayList<>();int l=newInterval[0],r=newInterval[1];int n=intervals.length;boolean flag=true;for (int i=0;i<n;i++){if (!flag) {int[] a=new int[2];a=intervals[i];ans.add(a);continue; }if (l>intervals[i][1]){int[] a=new int[2];a=intervals[i];ans.add(a);continue;}if (r>=intervals[i][0]){l=Math.min(l,intervals[i][0]);r=Math.max(r,intervals[i][1]);continue;}int[] a={l,r};ans.add(a);flag=false;i--;}if (flag){int[] a={l,r};ans.add(a);}return ans.toArray(new int[ans.size()][]);}    
}

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

题目

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

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

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

提示:

1 <= points.length <= 1e5

points[i].length == 2

-2^31 <= xstart < xend <= 2^31 - 1

示例 1:
输入:points = [[10,16],[2,8],[1,6],[7,12]]
输出:2
解释:气球可以用2支箭来爆破:
-在x = 6处射出箭,击破气球[2,8]和[1,6]。
-在x = 11处发射箭,击破气球[10,16]和[7,12]。
示例 2:
输入:points = [[1,2],[3,4],[5,6],[7,8]]
输出:4
解释:每个气球需要射出一支箭,总共需要4支箭。
示例 3:
输入:points = [[1,2],[2,3],[3,4],[4,5]]
输出:2
解释:气球可以用2支箭来爆破:
- 在x = 2处发射箭,击破气球[1,2]和[2,3]。
- 在x = 4处射出箭,击破气球[3,4]和[4,5]。
解析:

这是个贪心题,按照左端点从小到大排好序后,观察区间的特点,就可以发现如果上个区间的右端点比这个区间的左端点大(可以相等),这两个区间就可以被一条箭引爆,左端点就没有考虑的必要了,都排序好了。之后,就是将上个区间右端点不断更新,和这个区间的左端点不断地比较,直到不合法了,就结束上一个区间,将现在的区间作为新的“起点” !

但有一个问题,就是将数组排序的问题,有点坑人!因为数据范围,进行比较时,不能在int的类型下进行做差比较,可能会出现溢出的情况。所以可以转化为Long型做差比较,或者Integer.compare()方法进行比较。

代码:
class Solution {public int findMinArrowShots(int[][] points) {int n=points.length;Arrays.sort(points,(s1,s2)->{if (s1[0]!=s2[0])return Integer.compare(s1[0], s2[0]);return Integer.compare(s1[1], s2[1]);});int l=-1,r=-1;int cnt=0;for (int i=0;i<n;i++){if (i==0){cnt++;r=points[i][1];continue;}if (r>=points[i][0]){r=Math.min(r,points[i][1]);}else{cnt++;r=points[i][1];}}return cnt;}
}

相关文章:

Java - LeetCode面试经典150题 - 区间 (三)

区间 228. 汇总区间 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中…...

NVIDIA网卡系列之ConnectX-6 DX规格信息(200G-PCIe 4.0x16-8PF1000VF-2019年发布)

背景 NVIDIA ConnectX-6是最大支持200G的产品&#xff0c;有DX LX等系列。LX一般是25G比较便宜。 核心关键点 200GbpsPCIe 4.0&#xff0c;最大lane: x16 (4.0的lane速 16GT/s * 16 256T/s&#xff0c;所以支持的是200G的网卡用PCIe4.0)QSFPPF&#xff0c;VF数量&#xff1…...

【案例】平面云

教程案例视频&#xff1a;Unity Shader Graph - 云教程 开发平台&#xff1a;Unity 2022 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、ShaderGraph 路线图 三、案例分析 核心思路&#xff1a;使用 Noise&#xff08;噪声&#xff09;模拟云层状态   3.1 说明…...

测试用例的进阶二

1. 按开发阶段划分 1.1 测试金字塔 从上到下&#xff0c;对于测试人员代码就是要求越来越低&#xff1b; 从下到上&#xff0c;越来越靠近用户&#xff1b; 从下到上&#xff0c;定位问题的成本越来越高&#xff1b; 1.2 单元测试(Unit Testing) 单元测试是对软件组成单元进…...

zotero WebDAV同步忘记密码

https://www.jianguoyun.com/#/safety 找到应用密码...

如何在 SQL 中创建一个新的数据库?

在SQL中创建一个新的数据库&#xff0c;首先你需要有一个可以执行SQL语句的环境。 这通常意味着你已经有了一个数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;如MySQL、PostgreSQL、Oracle或Microsoft SQL Server等。 不同的DBMS可能有不同的细节&#xff0c;但基本…...

《Linux从小白到高手》理论篇:Linux的进程管理详解

本篇将介绍Linux的进程管理相关知识&#xff0c;并将深入介绍Linux的进程间相互通信。 进程就是运行中的程序&#xff0c;一个运行着的程序&#xff0c;可能有多个进程。 比如Oracle DB&#xff0c;启动Oracle实例服务后&#xff0c;就会有多个进程。 Linux进程分类 在 Linux…...

【Qt】控件概述(3)—— 显示类控件

显示类控件 1. QLabel——标签1.1 setPixmap设置图片1.2 setAlignment设置文本对齐方式1.3 setWordWrap设置自动换行1.4 setIndent设置缩进1.5 setMargin设置边距1.6 body 2. QLCDNumber2.1 使用QTimer实现一个倒计时效果2.2 使用循环的方式实现倒计时 3. QProgressBar——进度…...

数据库管理-第247期 23ai:全球分布式数据库-Schema对象(20241004)

数据库管理247期 2024-10-04 数据库管理-第247期 23ai&#xff1a;全球分布式数据库-Schema对象&#xff08;20241004&#xff09;1 分区、表空间和Chunk&#xff08;块&#xff09;2 表空间组3 分片表4 分片表族5 复制表6 在所有分片上创建的非表对象总结 数据库管理-第247期 …...

Docker搭建一款开源的文档管理系统

1.系统介绍 Wizard是一款开源的文档管理系统&#xff0c;它支持多种格式类型的文档管理&#xff0c;包括Markdown、Swagger和Table&#xff0c;以适应不同场景和需求下的文档管理需求。 1.1功能特点 开源免费&#xff1a;Wizard是一款完全免费的开源项目&#xff0c;用户可以…...

软件验证与确认实验一:静态分析

目录 1. 实验目的及要求.................................................................................................... 3 2. 实验软硬件环境.................................................................................................... 3 …...

基于SpringBoot+Vue的高校运动会管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

什么东西可以当做GC Root,跨代引用如何处理?

引言 在Java的垃圾回收机制中&#xff0c;GC Root&#xff08;Garbage Collection Root&#xff0c;垃圾回收根&#xff09;是垃圾回收器判断哪些对象是可达的&#xff0c;哪些对象可以被回收的起点。GC Root通过遍历对象图&#xff0c;标记所有可达的对象&#xff0c;而那些不…...

Python深度学习:从神经网络到循环神经网络

Python深度学习&#xff1a;从神经网络到循环神经网络 目录 ✨ 神经网络基础 1.1 &#x1f50d; 前向传播与反向传播&#x1f3a8; 卷积神经网络&#xff08;CNN&#xff09; 2.1 &#x1f5bc;️ 图像分类任务的实现 2.2 &#x1f680; 常用架构&#xff08;LeNet、VGG、Res…...

C++输⼊输出

1.<iostream> 是 Input Output Stream 的缩写&#xff0c;是标准的输⼊、输出流库&#xff0c;定义了标准的输⼊、输 出对象 2.std::cin 是 istream 类的对象&#xff0c;它主要⾯向窄字符&#xff08;narrow characters (of type char)&#xff09;的标准输 ⼊流。 3…...

卡码网KamaCoder 117. 软件构建

题目来源&#xff1a;117. 软件构建 C题解&#xff08;来源代码随想录&#xff09;&#xff1a;拓扑排序&#xff1a;给出一个 有向图&#xff0c;把这个有向图转成线性的排序。拓扑排序也是图论中判断有向无环图的常用方法。 拓扑排序的过程&#xff0c;其实就两步&#xff1…...

Acwing 线性DP

状态转移方程呈现出一种线性的递推形式的DP&#xff0c;我们将其称为线性DP。 Acwing 898.数字三角形 实现思路&#xff1a; 对这个三角形的数字进行编号&#xff0c;状态表示依然可以用二维表示&#xff0c;即f(i,j),i表示横坐标&#xff08;横线&#xff09;&#xff0c;j表…...

Docker面试-24年

1、Docker 是什么&#xff1f; Docker一个开源的应用容器引擎&#xff0c;是实现容器技术的一种工具&#xff0c;让开发者可以打包他们的应用以及环境到一个镜像中&#xff0c;可以快速的发布到任何流行的操作系统上。 2、Docker的三大核心是什么? 镜像&#xff1a;Docker的…...

ubuntu 安装k8s

#关闭 Swap 内存&#xff0c;配置完成建议重启一下 nano /etc/fstab #注释下面相似的一行 #/swapfile none swap sw 0 0 #重启 reboot#部属k8s apt update && apt install -y apt-transport-https 下载 gpg 密钥 curl https://mi…...

No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线

在这个数字时代&#xff0c;网络安全无处不在。了解Web安全的基本知识&#xff0c;不仅能保护我们自己&#xff0c;也能帮助我们在技术上更进一步。让我们一起深入探索Web安全的世界&#xff0c;掌握那些必备的安全知识&#xff01; 1. 客户端与WEB应用安全 前端漏洞&#xff1…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...