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

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇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 数组中的子数组将按照它们的起始值从小到大的顺序排列。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vr】【unity】白马VR课堂系列-VR开发核心基础05-主体设置-手柄对象的引入和设置

【视频教学】 【白马VR课堂系列-VR开发核心基础05-主体设置-手柄对象的引入和设置】 https://www.bilibili.com/video/BV19D4y1N73i/?share_source=copy_web&vd_source=7f5c96f5a58b7542fc6b467a9824b04e 【内容】 上一节引入了XR Origin并进行了初步设置,运行测试时V…

数据库主从切换过程中Druid没法获取连接错误

背景&#xff1a; 今天dba在进行DB的主从切换&#xff0c;导致应用一直报错&#xff0c;获取不到DB连接&#xff0c;druid的错误信息如下&#xff1a; Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutExc…

基于主动移频法与AFD孤岛检测的单相并网逆变器matlab仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真模型 算法介绍 (1)仿真模型由单相电网、逆变器、滤波环节、PI控制器、PWM生成器、锁相环、AFD控制器s函数、测量模块等构成&#xff1b; (2)采用主动移频法(AFD)进行孤岛检测&#xff1b; (3)相应速度…

CMake教程-第 7 步:添加系统自省功能

CMake教程-第 7 步&#xff1a;添加系统自省功能 1 CMake教程介绍2 学习步骤Step 1: A Basic Starting PointStep 2: Adding a LibraryStep 3: Adding Usage Requirements for a LibraryStep 4: Adding Generator ExpressionsStep 5: Installing and TestingStep 6: Adding Sup…

基于springboot实现汉服文化分享平台项目【项目源码+论文说明】

摘要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述汉服文化平台网站的当前背景以及系统开发的…

【Linux常用命令12】搜索命令及特殊字符的使用

which&#xff1a;查看可执行文件的位置 which 命令whereis&#xff1a;查看文件的位置&#xff0c;只能用于程序名的搜索 whereis [选项] 命令 -b 定位可执行文件。 -m 定位帮助文件。 -s 定位源代码文件。 -u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外…

Python 中的省略号对象

作为一名经验丰富的 Python 开发人员&#xff0c;您可能遇到过 Python 中的三个点…省略号对象。 如果您尝试在 Python 解释器中打印此内容&#xff0c;它将显示一个省略号。 本篇文章将介绍 Python 中省略号对象的使用。 使用省略号作为未编写代码的占位符 省略号对象可以以…

【vue2高德地图api】02-npm引入插件,在页面中展示效果

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、安装高德地图二、在main.js中配置需要配置2个key值以及1个密钥 三、在页面中使用3.1 新建路由3.2新建vue页面3.2-1 index.vue3.2…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程的集成方法与步骤(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 由于大家最自定义业务表单的整个集成方法还不熟悉&#xff0c;下面大概介绍一下这个流程与方法。 1、首先…

2.2 如何使用FlinkSQL读取写入到文件系统(HDFS\Local\Hive)

目录 1、文件系统 SQL 连接器 2、如何指定文件系统类型 3、如何指定文件格式 4、读取文件系统 4.1 开启 目录监控 4.2 可用的 Metadata 5、写出文件系统 5.1 创建分区表 5.2 滚动策略、文件合并、分区提交 5.3 指定 Sink Parallelism 6、示例_通过FlinkSQL读取kafk…

【MySQL】索引介绍、索引的数据结构

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 索引 一、索引概述二、索引结构2.1 BTree2.…

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network

文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…

使用vscode + vite + vue3+ element3 搭建vue3脚手架

技术栈 开发工具&#xff1a;VSCode 代码管理&#xff1a;Git 前端框架&#xff1a;Vue3 构建工具&#xff1a;Vite 路由&#xff1a;vue-router 状态管理&#xff1a;vuex AJAX&#xff1a;axios UI库&#xff1a;element-ui 3 数据模拟&#xff1a;mockjs css预处理&#xf…

【c++】跟werbtc学容器:unordered_set

1 std::unordered_set 元素无特定顺序的hash容器 D:\XTRANS\m98_rtc\ndrtc-webrtc\src\third_party\protobuf\src\google\protobuf\descriptor.cc#define HASH_MAP std::unordered_map #define HASH_SET std::unordered_set #define HASH_FXN

机器学习方法之k近邻方法的综述

机器学习方法之k近邻方法的综述 前言k近邻方法的相关综述最近邻方法k近邻方法加权k近邻方法kknn程序包的介绍前言 本篇博客的目的是想用最简单的话讲清楚k近邻方法,欢迎大家在评论区提出你们的看法,你们的批评是我前进的动力。 k近邻方法的相关综述 在统计识别领域k近邻方法…

手机爬虫用Appium详细教程:利用Python控制移动App进行自动化抓取数据

Appium是一个强大的跨平台工具&#xff0c;它可以让你使用Python来控制移动App进行自动化操作&#xff0c;从而实现数据的抓取和处理。今天&#xff0c;我将与大家分享一份关于使用Appium进行手机爬虫的详细教程&#xff0c;让我们一起来探索Appium的功能和操作&#xff0c;为手…

SQL实现自定义排序

业务事实上&#xff0c;经常会遇到排序问题&#xff0c;对数值类型字段排序不会有很大争议&#xff0c;但是有时希望对字符型字段按要求进行排序。本文记录自定义排序的几种方法。 使用case when关键字进行限定 本方法思路是将希望排序小的字符取值为较小的数字。注意end后面…

Three.js图案溶解shader

上图提供两种方式溶解显示 上面一排是根据现实的图案红色通道也就是r值进行溶解 下面一排提供额外的溶解纹理 可以通过简单更改呈现多种溶解图案 代码仓库 gitee b站账号&#xff1a;https://space.bilibili.com/374230437 interface IMapPath {map: string;dissolve?: string…

【C/C++】静态库和动态库命名规范及最佳实践

在软件开发中&#xff0c;静态库和动态库是常用的代码复用形式。为了保持良好的代码组织和可维护性&#xff0c;以及遵循统一的命名规范是非常重要的。本文将介绍静态库和动态库的命名规范&#xff0c;并提供一些最佳实践&#xff0c;以帮助开发人员在项目中正确命名库文件。 …

3-k8s-镜像仓库harbor搭建

文章目录 一、概念二、安装harbor三、使用harbor仓库 一、概念 官方概念&#xff1a;Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。 我们平时拉去镜像都是从线上仓库拉去&#xff0c;但是企业内部的镜像一般都不会随意传到网上&#xff0c;而是保存在自己公…