Leetcode 合并区间

在这里插入图片描述

我们借助一个辅助链表(元素类型是一维数组)来进行结果统计。

这个算法解决了“合并区间”的问题,具体要求是给定一组区间(每个区间有开始和结束位置),如果两个区间有重叠,那么需要将它们合并成一个区间,并返回所有不重叠的区间。

算法思想:

  1. 排序区间
    首先,我们将所有区间按照其开始时间进行排序。这是解决问题的关键,因为一旦区间按照开始时间排序后,我们可以轻松地通过遍历来检查相邻区间是否重叠。

    • 假设我们有区间:[[1,3], [2,6], [8,10], [15,18]]。排序后区间变为:[[1,3], [2,6], [8,10], [15,18]],这里已经按照开始时间排序好了。

    通过排序后,可以保证如果两个区间能够合并,那么它们必然是相邻的,这样我们可以通过一趟遍历完成合并操作。

  2. 合并区间
    在遍历区间时,我们将检查每个区间和之前的区间是否有重叠:

    • 如果当前区间的开始时间大于上一个区间的结束时间,说明它们不重叠,此时将当前区间添加到结果中。
    • 如果当前区间的开始时间小于或等于上一个区间的结束时间,说明它们有重叠,此时将它们合并成一个区间。合并的规则是更新上一个区间的结束时间为两个区间结束时间的最大值。

    举个例子:

    • 第一个区间 [1,3] 和第二个区间 [2,6] 有重叠,因为 2 小于等于 3,因此我们将它们合并为 [1,6]
    • 然后再看区间 [8,10][1,6],它们没有重叠(因为 8 大于 6),所以直接将 [8,10] 添加到结果中。
    • 同理,区间 [15,18] 也不与之前的区间重叠,直接加入结果。
  3. 返回结果
    遍历所有区间后,我们得到了合并后的区间集合,并将其返回。

算法流程:

  1. 首先对所有区间按起始位置升序排序。
  2. 使用一个链表 merged 存储合并后的区间。
  3. 遍历排序后的区间列表:
    • 如果当前区间与已合并的最后一个区间没有重叠,直接将当前区间加入 merged
    • 如果当前区间与最后一个区间重叠,更新最后一个区间的结束时间为两个区间中结束时间的较大值。
  4. 遍历完成后,将链表转换为数组并返回。

时间复杂度:

  1. 排序的时间复杂度O(n log n),其中 n 是区间的数量。
  2. 合并过程的时间复杂度O(n),因为我们只需要遍历一次区间列表。

因此,整体时间复杂度是 O(n log n),其中 n 是区间的数量。

示例:

输入:[[1,3],[2,6],[8,10],[15,18]]

  1. 首先按起始位置排序,得到:[[1,3],[2,6],[8,10],[15,18]]
  2. 合并 [1,3][2,6],结果是 [1,6]
  3. 8,10[1,6] 无重叠,直接添加。
  4. 15,18 和之前无重叠,直接添加。

输出:[[1,6],[8,10],[15,18]]

通过这个思路,我们能够高效地解决合并区间的问题。

Java 代码

class Solution {public int[][] merge(int[][] intervals) {//首先对intervals中的子数组按照开始时间(左区间)进行排序//Arrays.sort默认使用双轴快速排序, 根据第二个参数提供的lamba表达式定义的比较规则进行排序(升序)Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));//a, b是intervals中的两个元素,也就是2个子数组//然后初始化一个元素类型为一维数组的链表来存放结果LinkedList<int[]> merged = new LinkedList<>();for(int[] interval : intervals) {//根据merged结果链表中的末尾元素的右区间值和当前循环所指向的子数组的左区间元素进行判断if(merged.isEmpty() || merged.getLast()[1] < interval[0]) {//如果结果链表中末尾元素的右区间值小于当前子数组左区间元素值,说明没有重叠,直接加入当前子数组merged.add(interval);} else {//否则,有重叠,不需要添加子数组到结果链表中,仅仅需要更新链表末尾元素的右区间元素值merged.getLast()[1] = Math.max(merged.getLast()[1], interval[1]);}}//把结果链表转换为数组return merged.toArray(new int[merged.size()][]);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Cisco Packet Tracer超详细下载安装教程(附中文版插件)

一、安装包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RK8iQ9lJG__vBEGCYVYNSA 提取码&#xff1a;1lvb 压缩包解压密码&#xff1a;66668888&#xff0c;不能正常解压的&#xff0c;推荐使用360压缩解压 二、安装教程&#xff1a; 1.双击启动安装包 2.点击N…

使用功率谱密度 (PSD) 表征噪声

传递函数塑造噪声 图 1 显示了假设噪声源的频谱&#xff0c;该噪声源在所有频率下均表现出相同的平均功率&#xff0c;即 &#xff0c;其中 η 是常数。 假设噪声源的频谱。 图 1. 假设噪声源的频谱。 如果我们将此噪声应用于 LTI 系统&#xff0c;系统的传递函数将决定不同…

基于丹摩智算平台-手把手拿下经典目标检测模型 Faster-Rcnn

文章目录 1. 前言1. 1 丹摩智算平台1.2 经典目标检测模型 Faster-Rcnn 2. 前置准备2.1 WindTerm&#xff08;远程连接服务器&#xff09;2.2 项目源码 3. 服务器平台配置3.1 创建实例3.2 远程链接 4. Faster-rcnn 的环境配置4.1 上传文件&#xff0c;解压4.2 安装所需环境 5. 数…

springboot框架VUE3学院网站系统开发mysql数据库设计java编程计算机网页源码maven项目

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

专业软件测试服务机构介绍:软件确认测试的类型和方法

随着现代科技的迅猛发展&#xff0c;软件开发逐渐成为各类企业发展的核心。然而&#xff0c;软件的质量直接关系到企业的运营效率和用户体验。因此&#xff0c;软件确认测试作为确保软件质量的重要环节&#xff0c;正受到越来越多的关注。 软件确认测试是指在软件开发周期的最…

tensorboard展示不同运行的曲线结果

运行tensorboard曲线如下&#xff1a; tensorboard --logdir .有时候&#xff0c;曲线图会展示多条曲线&#xff0c;以至于我们想分辨哪条线来自哪次训练都做不到了。如下图是设置smoothing-0.6的结果&#xff1a; smoothing可以在页面找到设置按钮&#xff0c;呼出设置侧边…

Llama 3.1 技术研究报告-2

3.3 基础设施、扩展性和效率 我们描述了⽀持Llama 3 405B⼤规模预训练的硬件和基础设施&#xff0c;并讨论了⼏项优化措施&#xff0c;这些措施提⾼了训练效率。 3.3.1 训练基础设施 Llama 1和2模型在Meta的AI研究超级集群&#xff08;Lee和Sengupta&#xff0c;2022&#x…

直播美颜工具的开发详解:基于视频美颜SDK的解决方案

视频美颜SDK的出现&#xff0c;为开发直播美颜工具提供了一种高效的解决方案。本文将详细解析如何基于视频美颜SDK&#xff0c;开发一款性能优越、功能齐全的直播美颜工具。 1.视频美颜SDK的核心功能 视频美颜SDK是实现实时美颜的关键技术&#xff0c;其核心功能包括人脸检测、…

mysql逗号分隔的一行数据转为多行数据

原表&#xff1a; 结果&#xff1a; 方法一&#xff1a;如果每条数据的被逗号分隔的数量在637条以内&#xff0c;使用 mysql.help_topic&#xff08;mysql自带的表&#xff0c;只有637个序号&#xff09;。 select a.id,a.enclosure_ids,SUBSTRING_INDEX(SUBSTRING_INDEX(a.en…

harmonyOS 原来构建还有这么多弯弯绕绕

随着用户需求的不断增长&#xff0c;我们的 APP 已发展成功能丰富的超级APP&#xff0c;这也导致打包构建变得非常耗时&#xff0c;可能需要数小时&#xff0c;严重影响开发效率和产品迭代。通过采用模块化设计、增量构建、并行处理、缓存机制、优化依赖管理&#xff0c;以及云…

使用 Docker 部署 RStudio 的终极教程

一.介绍 在现代数据科学和统计分析领域&#xff0c;RStudio 是一个广受欢迎的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为用户提供了强大的工具来编写、调试和可视化 R 代码。然而&#xff0c;传统的 RStudio 安装可能面临环境配置复杂、版本兼容性等问题。Docker…

2.4K star的GOT-OCR2.0:端到端OCR 模型

GOT-OCR2.0是一款新一代的光学字符识别&#xff08;OCR&#xff09;技术&#xff0c;标志着人工智能在文本识别领域的重大进步。作为一款开源模型&#xff0c;GOT-OCR2.0不仅支持传统的文本和文档识别&#xff0c;还能够处理乐谱、图表以及复杂的数学公式&#xff0c;为用户提供…

报错解决方案

大模型-报错解决方案 百度千帆大模型 仅个人笔记使用&#xff0c;感谢点赞关注 百度千帆大模型 未开通付费模型 qianfan.errors.APIError: api return error, req_id: code: 17, msg: Open api daily request limit reached 可能的原因: 未开通所调用服务的付费权限&#xff0…

代码随想录算法day38 | 动态规划算法part11 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断子序列

1143.最长公共子序列 体会一下本题和 718. 最长重复子数组 的区别 力扣题目链接(opens new window) 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的…

掌握Python自动化办公的3个核心技能,全是干货建议收藏

随着Python在办公自动化领域的广泛应用&#xff0c;掌握Python的相关技能变得越来越重要。本文将详细介绍Python在文件操作、数据处理以及Excel操作方面的核心技能&#xff0c;帮助读者提升工作效率。 掌握Python自动化办公的核心技能&#xff0c;主要包括以下几个方面&#x…

统信服务器操作系统进入【单用户模式】

统信服务器操作系统D版、E版、A版进入单用户模式的方式。 文章目录 前言一、问题现象二、问题原因三、解决方案1. D版问题解决方案2. E版及A版问题解决方案前言 D版又称企业版、E版又称欧拉版、A版又称龙蜥版。 单用户模式主要是在 grub2 引导时编辑内核引导,一般用于修改用…

828华为云征文 | 云服务器Flexus X实例,搭建ChatGpt:AI-OpenAI

828华为云征文 | 云服务器Flexus X实例&#xff0c;搭建ChatGpt&#xff1a;AI-OpenAI 搭建能AI-OpenAI 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、安装 Docker 的必要依赖 yum install -y yum-utils device-mapper-persistent-data lvm2…

自恢复保险丝到底是什么?一篇文章足够让你了解清楚!!!

自恢复保险丝简介&#xff1a; 自恢复保险丝主要由核心材料高分子聚合物复合材料体组成&#xff0c;它是一种可反复使用的具有自恢复特性非线性的过流保护器件&#xff0c;聚合物复合材料体一般由聚合物、导电微粒、无机填料等组成。 自恢复保险丝是一种过流电子保护元件&#…

opencv-python学习笔记11-视频处理

目录 一、opencv视频处理的框架&#xff1a; 二、捕获视频类VideoCapture&#xff1a; &#xff08;1&#xff09;创建 VideoCapture 对象&#xff1a; &#xff08;2&#xff09;读取视频帧&#xff1a; &#xff08;3&#xff09;设置和获取视频属性&#xff1a; &#…

#联合体#

目录 定义 联合体的对齐方式 举个栗子&#x1f330; 联合体判断小端或大端 定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff0c;地址一样&#xff08;所以联合也叫共用体&#xff09;。 联合体…