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

【算法训练-排序算法 三】【排序应用】合并区间

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇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);}}

复杂度分析

合并区间是一个常见的算法问题,通常用于合并具有重叠部分的区间,以简化问题或提供更清晰的表示。以下是关于合并区间问题的时间复杂度和空间复杂度的讨论:

时间复杂度:
时间复杂度是衡量算法性能的关键指标,它表示算法在输入规模增加时所需的运行时间。对于合并区间问题,一种常见的解决方法是首先将区间按照起始值进行排序,然后遍历这些区间并合并它们。

  1. 排序:对区间按照起始值进行排序通常需要 O(n*log(n)) 的时间复杂度,其中 n 是区间的数量。

  2. 遍历和合并:一旦区间排序完成,遍历区间并合并重叠的部分通常需要线性时间,即 O(n)

因此,综合来看,合并区间的时间复杂度通常是 O(n*log(n)),其中 n 是区间的数量。这是由排序操作的时间复杂度主导的。

空间复杂度:
空间复杂度表示算法在执行过程中所需的额外内存空间。对于合并区间问题,空间复杂度通常取决于存储合并后的区间的数据结构。

  1. 如果您在原始区间上就地修改,而不创建额外的数据结构,则空间复杂度是 O(1),因为不需要额外的内存空间。

  2. 如果您创建一个新的数据结构来存储合并后的区间,空间复杂度将取决于这个数据结构的大小。通常情况下,合并后的区间数目会少于或等于初始区间数目,因此空间复杂度也是 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])的值来进行的,也就是按照子数组的起始值进行排序。

具体来说,这行代码的功能是:

  1. intervals 是一个二维整数数组,通常用于表示区间(例如,区间的起始和结束值)。

  2. Arrays.sort 是 Java 中用于对数组进行排序的方法。

  3. Comparator.comparingInt(interval -> interval[0]) 是一个比较器,它告诉排序方法要按照每个子数组的第一个元素(interval[0])的值进行升序排序。

所以,这个语句将根据 intervals 中每个子数组的第一个元素(起始值)来对二维数组进行排序,从小到大排列。排序后,intervals 数组中的子数组将按照它们的起始值从小到大的顺序排列。

这对于处理区间的问题非常有用,因为它可以将区间按照起始值进行排序,使得你可以更轻松地执行各种区间操作,比如合并重叠区间或查找包含某个点的区间等操作。

相关文章:

【算法训练-排序算法 三】【排序应用】合并区间

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【合并区间】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…...

【iOS】计算器仿写

文章目录 前言一、构建View界面二、Model中进行数据处理三、Controller层实现View与Model交互总结 前言 在前两周组内进行了计算器的仿写&#xff0c;计算器仿写主要用到了MVC框架的思想以及数据结构中用栈进行四则运算的思想&#xff0c;还有就是对OC中的字符串进行各种判错操…...

华为认证 | 华为HCIE认证该怎样备考?

华为HCIE认证是华为认证的最高级别&#xff0c;拥有了华为HCIE认证就代表拥有了华为官方认可的专家级技术水平。 因此HCIE认证的考试难度是非常高的&#xff0c;备考华为认证HCIE需要一定的准备和规划。 整理了一些简单易懂的指南&#xff0c;希望对各位备考的小伙伴一些帮助…...

10月份stable diffusion animatediff等插件使用指南,又来更新了

插件一直会更新&#xff0c;包含了基本市面上流行的90%插件&#xff0c;好用的插件更是不会错过&#xff0c;往期插件请看往期文章&#xff0c;如果你没有时间一直关注sd更新的进展&#xff0c;请关注我&#xff0c;一个月用几个小时看一下我的文章&#xff0c;最短时间跟进sd。…...

抓包工具charles修改请求和返回数据

数据篡改的主要使用场景&#xff1a; &#xff08;1&#xff09;mock场景&#xff0c;mock入参和返回值参数&#xff0c;实现mock测试 &#xff08;2&#xff09;安全测试&#xff0c;对于支付金额等比较重要的字段&#xff0c;可以修改请求参数来进行安全测试 1.首先选择要…...

matlab中绘制 维诺图(Voronoi Diagram)

1.专业术语&#xff08;相关概念&#xff09;&#xff1a; 基点Site&#xff1a;具有一些几何意义的点 细胞Cell&#xff1a;这个Cell中的任何一个点到Cell中基点中的距离都是最近的&#xff0c;离其他Site比离内部Site的距离都要远。 Cell的划分&#xff1a;基点Site与其它的…...

Mybatis TypeHandler 介绍及使用

Mybatis TypeHandler类型转换器是负责Java类和jdbc类型之间的转换 主要涉及到下面这几个类&#xff1a; TypeHandler 类型转换器的顶层接口BaseTypeHandler 抽象类继承自TypeHandler&#xff0c;Mybatis中所有的类型转换器实现均继承他。TypeHandlerRegistry 类型转换器注册器…...

Linux SVN 命令详解

1、将文件 checkout 到本地目录 svn checkout path&#xff08;path是服务器上的目录&#xff09; 例如&#xff1a;svn checkout svn://192.168.1.1/pro/domain 简写&#xff1a;svn co 2、往版本库中添加新的文件 svn add file 例如&#xff1a;svn add test.php(添加test.…...

Maven依赖引入的优先机制

xxxx待持续更新...

全开源无加密跨境电商购物网站系统源码(无货源模式+多语言+多货币)

在全球化的时代背景下&#xff0c;跨境电商成为了越来越受欢迎的消费方式&#xff0c;而建立一个源码无加密多语言跨境购物网站系统是一个具有挑战性的任务&#xff0c;但完全可行。以下是这个过程的一些主要步骤&#xff1a; 1. 确定需求和功能规划&#xff1a;先确定网站需要…...

Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等

1.更改视频帧数 降低视频帧数&#xff0c;简单的操作只能降低视频帧数&#xff0c;如果要增加视频帧数&#xff0c;那就要使用深度学习进行插帧处理&#xff1a; import cv2 from moviepy.editor import * def change_fps(inpt_path,output_path,fps):# 加载视频video Video…...

从javascript到vue再到react的演变

当提到前端开发中的框架时&#xff0c;JavaScript、Vue.js和React.js是三个最常见的名词。它们代表了Web开发中不同的技术选择和演变过程。本文将探讨JavaScript从原生到Vue.js再到React.js的演变&#xff0c;以及每个阶段的特点和优势。 JavaScript: 动态语言的基础 JavaScr…...

50个渗透(黑客)常用名词及解释

目录 前言一、渗透测试1. 渗透测试&#xff1a;2. 黑盒测试&#xff1a;3. 白盒测试&#xff1a;4. 社会工程学&#xff1a;5. 缓冲区溢出&#xff1a;6. 拒绝服务攻击&#xff1a;7. DDoS攻击&#xff1a;8. XSS攻击&#xff1a;9. CSRF攻击&#xff1a;10. SQL注入&#xff1…...

开源游戏引擎和模拟器的项目合集 | 开源专题 No.38

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

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&#xff08;扩散模型&#xff09; Diffusion扩散模型分为两个阶段&#xff1a;前向过程 反向过程 前向过程&#xff1a;不断往输入图片中添加高斯噪声来破坏图像反向过程&#xff1a;使用一系列马尔可夫链逐步将噪声还原为原始…...

2022年亚太杯APMCM数学建模大赛A题结晶器熔剂熔融结晶过程序列图像特征提取及建模分析求解全过程文档及程序

2022年亚太杯APMCM数学建模大赛 A题 结晶器熔剂熔融结晶过程序列图像特征提取及建模分析 原题再现&#xff1a; 连铸过程中的保护渣使钢水弯液面隔热&#xff0c;防止钢水在连铸过程中再次氧化&#xff0c;控制传热&#xff0c;为铸坯提供润滑&#xff0c;并吸收非金属夹杂物…...

金融网站如何做好安全防护措施?

联网的发展为当代很多行业的发展提供了一个更为广阔的平台&#xff0c;而对于中国的金融业来说&#xff0c;互联网金融这一新兴理念已经为 人们所接受&#xff0c;且发展迅速。我们也都知道金融行业对互联网技术是非常严格的&#xff0c;这对互联网的稳定性和可靠性提出了较高的…...

2023年中国恋爱社区未来发展趋势分析:多元化盈利模式实现可持续发展[图]

恋爱社区指满足情侣之间互动、记录及娱乐需求&#xff0c;以维护情侣恋爱关系的虚拟社区。恋爱社区行业主要以线上APP的虚拟形式为用户提供相关服务&#xff0c;其业务包括情侣记录、情侣互动、情侣娱乐、公共社区、线上购物、增值服务。 恋爱社区主要业务 资料来源&#xff1…...

Elasticsearch:生成式人工智能带来的社会转变

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

学习神经网络

一、神经网络概述&#xff1a;人工智能的核心基石&#xff08;一&#xff09;神经网络的定义与起源神经网络&#xff0c;全称为人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff0c;是一种模仿生物神经网络&#xff08;动物大脑神经元网…...

Xray漏洞扫描工具进阶实战:从配置优化到企业级部署

1. Xray工具深度调优&#xff1a;从基础配置到性能极限 第一次用Xray做全站扫描时&#xff0c;我盯着卡在63%的进度条整整两小时&#xff0c;直到发现是默认线程数把系统资源吃光了。这个教训让我意识到&#xff0c;会运行扫描和真正用好扫描工具完全是两回事。下面分享的调优方…...

基于python的演唱会抢票系统

目录同行可拿货,招校园代理 ,本人源头供货商核心功能模块技术实现要点扩展功能设计异常处理方案项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 核心功能模块 用户管理模块 注册/登录功…...

CD3抗体如何成为双抗药物的核心靶点?

一、双特异性抗体药物为何发展迅猛&#xff1f;双特异性抗体&#xff08;BsAb&#xff09;是一类能够同时特异性结合两个不同抗原或抗原表位的人工工程抗体。其通过同时阻断两个靶点介导的生物学功能&#xff0c;或将表达不同抗原的细胞拉近&#xff0c;实现单一抗体难以完成的…...

告别setData!用mobx-miniprogram+miniprogram-computed重构你的小程序状态管理(保姆级避坑指南)

重构小程序状态管理&#xff1a;mobx-miniprogram与miniprogram-computed实战指南 如果你正在开发一个功能逐渐复杂的中大型微信小程序&#xff0c;大概率已经遇到了这样的困境&#xff1a;页面间状态共享越来越混乱&#xff0c;setData调用遍布各个角落&#xff0c;视图更新性…...

抖音音频高效提取工具:从繁琐操作到一键解决方案

抖音音频高效提取工具&#xff1a;从繁琐操作到一键解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

三步打造个性化Windows任务栏:TranslucentTB效率工具完全指南

三步打造个性化Windows任务栏&#xff1a;TranslucentTB效率工具完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否曾觉得Wi…...

3步革新Windows任务栏:TranslucentTB打造个性化桌面体验

3步革新Windows任务栏&#xff1a;TranslucentTB打造个性化桌面体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在视觉主导的数字时代…...

Graphormer部署指南:3.7GB纯Transformer图神经网络GPU快速启动

Graphormer部署指南&#xff1a;3.7GB纯Transformer图神经网络GPU快速启动 1. 项目概述 Graphormer是一种基于纯Transformer架构的图神经网络&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。这个3.7GB大小的模型在OGB、PCQM4M…...

简单介绍C语言中的字符串函数

1.首先给出字符分类函数这几个就简单过一下&#xff0c;不做重点说明。这两个为字符转换函数&#xff0c;顾名思义&#xff0c;没什么好介绍的&#xff1b;接下来简单介绍几个字符串函数&#xff1a;strlen.strcpy.strcat.strstr.strncpy.strncat.memcpy.memmove;strlen:求字符…...