【算法训练-排序算法 三】【排序应用】合并区间
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【合并区间】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。
明确目标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍。
合并区间【MID】
一道一直想要解决的高频题,用到了排序
题干
解题思路
如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。如下图所示,标记为蓝色、黄色和绿色的区间分别可以合并成一个大区间,它们在排完序的列表中是连续的
我们用数组 merged 存储最终的答案。
- 首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入 merged 数组中,并按顺序依次考虑之后的每个区间:
- 如果当前区间的左端点在数组 merged 中最后一个区间的右端点之后,那么它们不会重合,我们可以直接将这个区间加入数组 merged 的末尾;
- 否则,它们重合,我们需要用当前区间的右端点更新数组 merged 中最后一个区间的右端点,将其置为二者的较大值。
总体思路是左端点从小到大排列,每次比较只要比较新区间的左端点是否在已合并区间右端点之后就可以了,在之后则独立,在之前则重叠(而且由于左端点升序,在之前也是在之前已合并区间的中间,极端情况是和已排序区间左端点重叠)
代码实现
给出代码实现基本档案
基本数据结构:数组
辅助数据结构:无
算法:快速排序(分治算法)、二分查找
技巧:双指针
import java.util.*;/** public class Interval {* int start;* int end;* public Interval(int start, int end) {* this.start = start;* this.end = end;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param intervals Interval类ArrayList* @return Interval类ArrayList*/public ArrayList<Interval> merge (ArrayList<Interval> intervals) {// 1 先对集合进行排序intervals.sort(Comparator.comparingInt(interval -> interval.start));// 2 遍历顺序数组进行合并ArrayList<Interval> result = new ArrayList<Interval>();for (Interval interval : intervals) {// 2-1 获取当前区间左右端点和已合并区间右端点int leftPoint = interval.start;int rightPoint = interval.end;// 2-2 如果结果区间为空或者当前区间左端点大于已合并区间右端点,则当前区间作为独立子区间加入集合if (result.size() == 0 || leftPoint > result.get(result.size() - 1).end) {result.add(interval);} else {// 2-3 否则认为当前区间与已合并区间有重叠,只需更新合并区间右端点result.get(result.size() - 1).end = Math.max(result.get(result.size() - 1).end, rightPoint);}}return result;}
}
leetcode数组入参的处理方法:
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param n int整型 the n* @return int整型*/public int[][] merge(int[][] intervals) {// 1 先对数组进行排序Arrays.sort(intervals, Comparator.comparingInt(interval->interval[0]));// 2 遍历已排序数组,进行区间合并int[][] result = new int[intervals.length][2];int idx = -1;for (int[] interval : intervals) {// 2-1 获取当前区间左右边界以及合并区间右边界int leftPoint = interval[0];int rightPoint = interval[1];// 2-2 如果已合并区间为空,或当前区间左端点大于已合并区间右端点,则不重叠if (idx == -1 || result[idx][1] < leftPoint) {idx++;result[idx] = interval;} else {// 2-3 反之则重叠,已两个区间较大值为新的右边界result[idx][1] = Math.max(result[idx][1], rightPoint);}}return Arrays.copyOf(result, idx + 1);}}
复杂度分析
合并区间是一个常见的算法问题,通常用于合并具有重叠部分的区间,以简化问题或提供更清晰的表示。以下是关于合并区间问题的时间复杂度和空间复杂度的讨论:
时间复杂度:
时间复杂度是衡量算法性能的关键指标,它表示算法在输入规模增加时所需的运行时间。对于合并区间问题,一种常见的解决方法是首先将区间按照起始值进行排序,然后遍历这些区间并合并它们。
-
排序:对区间按照起始值进行排序通常需要 O(n*log(n)) 的时间复杂度,其中 n 是区间的数量。
-
遍历和合并:一旦区间排序完成,遍历区间并合并重叠的部分通常需要线性时间,即 O(n)。
因此,综合来看,合并区间的时间复杂度通常是 O(n*log(n)),其中 n 是区间的数量。这是由排序操作的时间复杂度主导的。
空间复杂度:
空间复杂度表示算法在执行过程中所需的额外内存空间。对于合并区间问题,空间复杂度通常取决于存储合并后的区间的数据结构。
-
如果您在原始区间上就地修改,而不创建额外的数据结构,则空间复杂度是 O(1),因为不需要额外的内存空间。
-
如果您创建一个新的数据结构来存储合并后的区间,空间复杂度将取决于这个数据结构的大小。通常情况下,合并后的区间数目会少于或等于初始区间数目,因此空间复杂度也是 O(n)。
总结:合并区间问题的时间复杂度通常是 O(n*log(n)),空间复杂度可以是 O(1) 或 O(n),具体取决于是否创建了新的数据结构来存储合并后的区间。
拓展知识:Arrays的用法
Arrays的一些用法拓展描述下
Arrays.copyOf(result, x)
描述了什么
Arrays.copyOf(result, x)
是一个Java方法,它的含义是创建一个新数组,这个新数组的长度为 x
,并且将原始数组 result
中的元素复制到新数组中。如果 x
小于原始数组的长度,那么新数组将截断,只包含原始数组中前 x
个元素。如果 x
大于原始数组的长度,新数组将在末尾用默认值填充,这个默认值取决于元素的数据类型,例如,数值类型默认是0,引用类型默认是null
。
这个方法允许你在不改变原始数组的情况下创建一个具有不同长度的新数组,非常方便,特别是在需要调整数组大小时。例如:
int[] result = {1, 2, 3, 4, 5};
int x = 8; // 新数组的长度int[] newArray = Arrays.copyOf(result, x);// 新数组现在将会是 {1, 2, 3, 4, 5, 0, 0, 0},长度为 8
在这个示例中,Arrays.copyOf
创建了一个长度为8的新数组,并将原始数组 result
中的元素复制到新数组中,多出的部分用0填充。
Arrays.sort(intervals, Comparator.comparingInt(interval->interval[0])) 描述下这个语句做了什么
这个语句使用了 Java 中的 Arrays.sort
方法来对一个二维数组 intervals
进行排序。排序是基于二维数组中每个子数组的第一个元素(interval[0]
)的值来进行的,也就是按照子数组的起始值进行排序。
具体来说,这行代码的功能是:
-
intervals
是一个二维整数数组,通常用于表示区间(例如,区间的起始和结束值)。 -
Arrays.sort
是 Java 中用于对数组进行排序的方法。 -
Comparator.comparingInt(interval -> interval[0])
是一个比较器,它告诉排序方法要按照每个子数组的第一个元素(interval[0]
)的值进行升序排序。
所以,这个语句将根据 intervals
中每个子数组的第一个元素(起始值)来对二维数组进行排序,从小到大排列。排序后,intervals
数组中的子数组将按照它们的起始值从小到大的顺序排列。
这对于处理区间的问题非常有用,因为它可以将区间按照起始值进行排序,使得你可以更轻松地执行各种区间操作,比如合并重叠区间或查找包含某个点的区间等操作。
相关文章:

【算法训练-排序算法 三】【排序应用】合并区间
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【合并区间】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…...

【iOS】计算器仿写
文章目录 前言一、构建View界面二、Model中进行数据处理三、Controller层实现View与Model交互总结 前言 在前两周组内进行了计算器的仿写,计算器仿写主要用到了MVC框架的思想以及数据结构中用栈进行四则运算的思想,还有就是对OC中的字符串进行各种判错操…...
华为认证 | 华为HCIE认证该怎样备考?
华为HCIE认证是华为认证的最高级别,拥有了华为HCIE认证就代表拥有了华为官方认可的专家级技术水平。 因此HCIE认证的考试难度是非常高的,备考华为认证HCIE需要一定的准备和规划。 整理了一些简单易懂的指南,希望对各位备考的小伙伴一些帮助…...

10月份stable diffusion animatediff等插件使用指南,又来更新了
插件一直会更新,包含了基本市面上流行的90%插件,好用的插件更是不会错过,往期插件请看往期文章,如果你没有时间一直关注sd更新的进展,请关注我,一个月用几个小时看一下我的文章,最短时间跟进sd。…...

抓包工具charles修改请求和返回数据
数据篡改的主要使用场景: (1)mock场景,mock入参和返回值参数,实现mock测试 (2)安全测试,对于支付金额等比较重要的字段,可以修改请求参数来进行安全测试 1.首先选择要…...

matlab中绘制 维诺图(Voronoi Diagram)
1.专业术语(相关概念): 基点Site:具有一些几何意义的点 细胞Cell:这个Cell中的任何一个点到Cell中基点中的距离都是最近的,离其他Site比离内部Site的距离都要远。 Cell的划分:基点Site与其它的…...
Mybatis TypeHandler 介绍及使用
Mybatis TypeHandler类型转换器是负责Java类和jdbc类型之间的转换 主要涉及到下面这几个类: TypeHandler 类型转换器的顶层接口BaseTypeHandler 抽象类继承自TypeHandler,Mybatis中所有的类型转换器实现均继承他。TypeHandlerRegistry 类型转换器注册器…...
Linux SVN 命令详解
1、将文件 checkout 到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co 2、往版本库中添加新的文件 svn add file 例如:svn add test.php(添加test.…...
Maven依赖引入的优先机制
xxxx待持续更新...

全开源无加密跨境电商购物网站系统源码(无货源模式+多语言+多货币)
在全球化的时代背景下,跨境电商成为了越来越受欢迎的消费方式,而建立一个源码无加密多语言跨境购物网站系统是一个具有挑战性的任务,但完全可行。以下是这个过程的一些主要步骤: 1. 确定需求和功能规划:先确定网站需要…...
Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等
1.更改视频帧数 降低视频帧数,简单的操作只能降低视频帧数,如果要增加视频帧数,那就要使用深度学习进行插帧处理: import cv2 from moviepy.editor import * def change_fps(inpt_path,output_path,fps):# 加载视频video Video…...
从javascript到vue再到react的演变
当提到前端开发中的框架时,JavaScript、Vue.js和React.js是三个最常见的名词。它们代表了Web开发中不同的技术选择和演变过程。本文将探讨JavaScript从原生到Vue.js再到React.js的演变,以及每个阶段的特点和优势。 JavaScript: 动态语言的基础 JavaScr…...
50个渗透(黑客)常用名词及解释
目录 前言一、渗透测试1. 渗透测试:2. 黑盒测试:3. 白盒测试:4. 社会工程学:5. 缓冲区溢出:6. 拒绝服务攻击:7. DDoS攻击:8. XSS攻击:9. CSRF攻击:10. SQL注入࿱…...

开源游戏引擎和模拟器的项目合集 | 开源专题 No.38
yuzu-emu/yuzu Stars: 26.2k License: GPL-3.0 yuzu是一款全球最受欢迎的开源Nintendo Switch模拟器,由Citra创建者编写。它采用C语言编写,并具有可移植性,在Windows和Linux上进行积极维护。该模拟器能够全速运行大多数商业游戏,…...

ELK + Filebeat 分布式日志管理平台部署
ELK Filebeat 分布式日志管理平台部署 1、前言1.1日志分析的作用1.2需要收集的日志1.3完整日志系统的基本特征 2、ELK概述2.1ELK简介2.2为什么要用ELK?2.3ELK的组件 3、ELK组件详解3.1Logstash3.1.1简介3.1.2Logstash命令常用选项3.1.3Logstash 的输入和输出流3.1.4Logstash配…...

Stable Diffusion原理
一、Diffusion扩散理论 1.1、 Diffusion Model(扩散模型) Diffusion扩散模型分为两个阶段:前向过程 反向过程 前向过程:不断往输入图片中添加高斯噪声来破坏图像反向过程:使用一系列马尔可夫链逐步将噪声还原为原始…...

2022年亚太杯APMCM数学建模大赛A题结晶器熔剂熔融结晶过程序列图像特征提取及建模分析求解全过程文档及程序
2022年亚太杯APMCM数学建模大赛 A题 结晶器熔剂熔融结晶过程序列图像特征提取及建模分析 原题再现: 连铸过程中的保护渣使钢水弯液面隔热,防止钢水在连铸过程中再次氧化,控制传热,为铸坯提供润滑,并吸收非金属夹杂物…...
金融网站如何做好安全防护措施?
联网的发展为当代很多行业的发展提供了一个更为广阔的平台,而对于中国的金融业来说,互联网金融这一新兴理念已经为 人们所接受,且发展迅速。我们也都知道金融行业对互联网技术是非常严格的,这对互联网的稳定性和可靠性提出了较高的…...

2023年中国恋爱社区未来发展趋势分析:多元化盈利模式实现可持续发展[图]
恋爱社区指满足情侣之间互动、记录及娱乐需求,以维护情侣恋爱关系的虚拟社区。恋爱社区行业主要以线上APP的虚拟形式为用户提供相关服务,其业务包括情侣记录、情侣互动、情侣娱乐、公共社区、线上购物、增值服务。 恋爱社区主要业务 资料来源࿱…...

Elasticsearch:生成式人工智能带来的社会转变
作者:JEFF VESTAL 了解 Elastic 如何走在大型语言模型革命的最前沿 – 通过提供实时信息并将 LLM 集成到数据分析的搜索、可观察性和安全系统中,帮助用户将 LLM 提升到新的高度。 iPhone 社会转变:新时代的黎明 曾几何时,不久前…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...