56. 合并区间(力扣LeetCode)

文章目录

  • 56. 合并区间
    • 题目描述
    • 思路
    • 贪心算法
      • 方法一:直接在res中修改
        • 代码逻辑梳理:
      • 方法二:在原数组中插入一个超出题目范围的数组
        • 代码逻辑梳理:

56. 合并区间

题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 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] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

思路

本题的本质其实还是判断重叠区间问题。

大家如果认真做题的话,话发现和我们刚刚讲过的452. 用最少数量的箭引爆气球和 435. 无重叠区间都是一个套路。

这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。

所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

按照左边界从小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1]intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴,所以是<=)

这么说有点抽象,看图:(注意图中区间都是按照左边界排序之后了)

在这里插入图片描述
知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢?

其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。

贪心算法

方法一:直接在res中修改

这段代码是C++语言编写的,用于解决合并重叠区间的问题。下面是对这段代码的详细注释:

// 定义Solution类
class Solution {
public:// 静态比较函数,用于sort函数中,按区间的起始位置升序排序// 如果a的起始位置小于b的起始位置,则返回truestatic bool cmp(vector<int> a, vector<int> b) {return a[0] < b[0];}// 合并区间的主要功能函数vector<vector<int>> merge(vector<vector<int>>& intervals) {// 存储最终合并后的区间数组vector<vector<int>> res;// 首先,根据区间的起始位置,使用自定义的比较函数cmp对区间进行排序sort(intervals.begin(), intervals.end(), cmp);// 将排序后的第一个区间添加到结果数组中,作为合并的起点res.push_back(intervals[0]);// 从第二个区间开始遍历排序后的区间数组for(int i = 1; i < intervals.size(); i++) {// 如果当前区间的起始位置小于等于结果数组中最后一个区间的结束位置,// 则说明当前区间与结果数组中的最后一个区间有重叠if(intervals[i][0] <= res.back()[1])// 更新结果数组中最后一个区间的结束位置为当前区间和最后一个区间结束位置的较大值// 以此合并重叠的区间res.back()[1] = max(res.back()[1], intervals[i][1]);else// 如果当前区间与结果数组中的最后一个区间没有重叠,// 则直接将当前区间添加到结果数组中res.push_back(intervals[i]);}// 返回合并后的区间数组return res;}
};
代码逻辑梳理:
  1. 排序:首先通过sort函数和自定义的比较函数cmp对输入的区间数组进行排序,确保区间是按照起始位置升序排列的。这是解决问题的关键步骤,因为只有排序后,我们才能通过顺序遍历来识别哪些区间是重叠的。

  2. 初始化:将排序后的第一个区间直接添加到结果数组res中。这是因为,不管后面的区间是否与它重叠,第一个区间总是需要被包含在最终的结果中。

  3. 遍历合并:从第二个区间开始遍历,对每个区间,检查它的起始位置是否小于等于结果数组中最后一个区间的结束位置。如果是,说明当前区间与结果数组中的最后一个区间重叠,此时需要更新结果数组中最后一个区间的结束位置为两个区间结束位置的较大值,以此来合并区间。如果不重叠,直接将当前区间添加到结果数组中。

  4. 返回结果:经过遍历和条件判断后,所有重叠的区间都被合并,函数返回最终的结果数组。

这种方法的优点是逻辑清晰,且只需要一次遍历就可以完成合并,效率较高。

方法二:在原数组中插入一个超出题目范围的数组

这段代码是使用C++语言编写的,用于解决合并区间的问题。下面是这段代码的详细注释:

// 定义Solution类
class Solution {
public:// 静态比较函数,用于sort函数中,按区间的起始位置升序排序// 如果a的起始位置小于b的起始位置,则返回truestatic bool cmp(vector<int> a,vector<int> b){return a[0]<b[0];}// 合并区间的主要函数vector<vector<int>> merge(vector<vector<int>>& intervals) {// 存储最终合并后的区间结果vector<vector<int>> res;// 首先,根据区间的起始位置,使用自定义的比较函数cmp对区间进行排序sort(intervals.begin(),intervals.end(),cmp);// 为了处理方便,在intervals的末尾添加一个超出范围的区间[10001,10001],// 这样在遍历时就不需要特殊处理最后一个区间intervals.push_back({10001,10001});// 遍历排序后的区间for(int i=0;i<intervals.size()-1;i++){// 如果当前区间的结束位置不小于下一个区间的起始位置,说明两个区间有重叠if(intervals[i+1][0]<=intervals[i][1]){// 更新下一个区间的结束位置为当前区间和下一个区间结束位置的较大值// 这样做是为了合并重叠的区间intervals[i+1][1]=max(intervals[i+1][1],intervals[i][1]);// 更新下一个区间的起始位置为当前区间的起始位置intervals[i+1][0]=intervals[i][0];}else{// 如果没有重叠,则将当前区间加入到结果中res.push_back(intervals[i]);}}// 返回合并后的区间集合return res;}
};
代码逻辑梳理:
  1. 排序:首先,通过自定义的排序函数cmp将所有区间根据起始位置进行升序排序。这是合并区间问题的核心步骤之一,它可以让我们在后续遍历时更容易判断区间是否重叠。

  2. 遍历:遍历排序后的区间数组。对于每个区间,检查它与下一个区间是否重叠(即当前区间的结束位置不小于下一个区间的起始位置)。

  3. 合并处理:如果两个区间重叠,更新下一个区间的起始和结束位置,将它们合并为一个区间。这里通过修改下一个区间的起始和结束位置来实现合并,而非直接操作当前区间,是为了简化逻辑,因为通过前面的排序保证了遍历时区间是按起始位置顺序来的。

  4. 添加非重叠区间:如果两个区间不重叠,将当前区间加入到结果集中。

  5. 处理边界:通过在intervals末尾添加一个超出范围的区间[10001,10001],简化了最后一个区间的处理逻辑,避免了在循环中额外判断是否为最后一个区间。这个超出范围的区间不会被加入最终结果,因为它是在遍历结束前添加的,仅用作逻辑上的辅助。

这种方法直接在原数组上进行操作,减少了空间复杂度,但修改了输入数组,这在某些情况下可能不是最佳做法。在实际应用中,根据是否允许修改输入数组来选择合适的方法。

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

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

相关文章

律甲法务OA平台:信鸥科技引领法律行业新篇章

随着信息技术的飞速发展&#xff0c;法律行业也迎来了数字化转型的重要时刻。在这个信息化、智能化的时代&#xff0c;如何运用科技手段提升法律服务的质量和效率&#xff0c;成为法律行业亟待解决的问题。信鸥科技&#xff0c;作为业界的佼佼者&#xff0c;凭借其深厚的技术积…

Kafka详细教程(一)

总体目录 1、什么是消息队列 消息队列&#xff0c;英文名&#xff1a;Message Queue&#xff0c;经常缩写为MQ。从字面上来理解&#xff0c;消息队列是一种用来存储消息的队列 。来看一下下面的代码 // 1.创建一个保存字符串的队列Queue<String> queue new LinkedList&…

使用patchelf解决vscode远程连接不支持低版本glibc的问题

使用patchelf解决vscode远程连接不支持低版本glibc的问题 目录 使用patchelf解决vscode远程连接不支持低版本glibc的问题1. 动态链接库下载2. 用 patchelf 修改 vscode-server 依赖的 glibc 版本 VScode 1.86 版本的 remote 要求 glibc 2.28 及以上&#xff0c;于是在各种旧版本…

基于RK3588多can口多串口机器人全功能板

RK3588机器人控制器有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的 H.265 和 VP9 解码器、8K30fps 的 H.264 解码器和 4K60fps 的 AV1 解码器&#xff1b;支持 8K30fps 的 H.264 和H.265 编码器&#xff0c;高质量的 JPEG 编码器/解码器&…

不显示excel中零值方法

excel中想让数字0不显示的方法如下&#xff1a; √去掉则数字格式0不再显示 。若找不到此项&#xff0c;运行以下代码即可&#xff1a; Sub 去除excel中零值() ActiveWindow.DisplayZeros False 不显示零值 End Sub altf11打开vba idea&#xff0c;插入->模块&#xff…

UniRepLKNet:一种用于音频、视频、点云、时间序列和图像识别的通用感知大核卷积神经网络

论文: https://arxiv.org/abs/2311.15599 模型: https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main 主页&#xff1a;https://invictus717.github.io/UniRepLKNet/ contribution 提出了四条guide line用于设计大核CNN架构模型&#xff0c;用于图像识别&#xff0c;语…

elementui日期时间选择框自定义组件

1.需求场景 业务中需要&#xff0c;日期选择框方便客户对日期的选择&#xff08;比如近5天&#xff0c;本周&#xff0c;本月&#xff0c;本年等等&#xff09;&#xff0c;并按小时展示。 2.组件代码MyDateTimeChange.vue <template><el-date-pickerv-model"…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

国赛大纲解读

1. 第一部分,是针对5G基础知识的掌握,第二部分是人工智能基本算法的掌握,就是人工智能的应用,用5G+人工智能(AI算法)进行网络优化的问题,要有网络优化的基础知识,比如说:某个区域的覆盖问题,覆盖特别差,但有数据,覆盖电频,srp值这些数据给你,根据数据来判断是…

设计模式——行为型——策略模式Strategy

Q&#xff1a;策略模式的特点 A&#xff1a; 具体算法从具体的业务方法中独立出来策略模式是同行为的不同实现 Q&#xff1a;什么时候使用策略模式 A&#xff1a;多个if-else使用策略模式 收费对象类 public class CashContext {private CashStrategy cashStrategy;public…

【C++入门】 初见,单推,与C++的第一次约会

关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒ 引言&#xff1a;本篇博客我们开始与C的第一次约会&#xff0c;C是兼容c的&#xff0c;本篇博客我们将了解到C关键字有哪些&#xff0c;C命名空间&#xff0c;C输入与输出和缺省参数的内容&#xff0c;请放心食用 ~ 文章目录 一 &#x1f3e0; C…

文献阅读工具-->Adobe pdf + 有道词典

Adobe pdf 有道词典 最近一直在考虑用什么文献阅读工具&#xff0c;痛点无非就是想用翻译功能&#xff0c;Adobe pdf的添加注释已经很好用了&#xff0c;使用了zotero&#xff0c;感觉不行&#xff08;不能直接对原文件修改&#xff0c;有副本&#xff0c;麻烦&#xff09;。…

excel匹配替换脱敏身份证等数据

假如excel sheet1中有脱敏的身份证号码和姓名&#xff0c;如&#xff1a; sheet2中有未脱敏的数据数据 做法如下&#xff1a; 1、在sheet2的C列用公式 LEFT(A2,6)&REPT("*",8)&RIGHT(A2,4) 做出脱敏数据&#xff0c;用来与sheet1的脱敏数据匹配 2、在sheet…

AWS基础网络产品及协同架构-Networking

简介 一个完整的AWS网络架构图&#xff0c;包含了如下能力&#xff1a; Users (用户): 表示使用AWS服务的用户或系统。 SaaS (软件即服务): 表示在AWS上运行的软件服务&#xff0c;如企业微信可能作为SaaS提供。 example.com?: 这可能是一个示例域名&#xff0c;用于展示如何…

快速上手Spring Cloud 十:Spring Cloud与微前端

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

分享多种mfc100u.dll丢失的解决方法(一键修复DLL丢失的方法)

在使用电脑过程中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;例如mfc100u.dll。这些DLL文件是动态链接库&#xff08;Dynamic Link Libraries&#xff09;的缩写&#xff0c;它们包含了可以被多个程序共享的代码和数据。今天&#xff0c;我们将深入探讨mfc100u.d…

深度学习:基于PyTorch的模型解释工具Captum

深度学习&#xff1a;基于PyTorch的模型解释工具Captum 引言简介示例安装解释模型的预测解释文本模型情绪分析问答 解释视觉模型特征分析特征消融鲁棒性 解释多模态模型 引言 当我们训练神经网络模型时&#xff0c;我们通常只关注模型的整体性能&#xff0c;例如准确率或损失函…

Pillow教程06:将图片中出现的黄色和红色,改成绿色

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

浅析扩散模型与图像生成【应用篇】(十三)——GLIDE

13. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models 该文提出一种基于文本引导的扩散模型用于图像的生成和编辑&#xff0c;可以根据给定的文字描述来生成或编辑图像。在ADM中我们曾介绍了一种基于分类器引导的图像生成模型&a…

鸿蒙HarmonyOS应用开发之使用Node-API实现跨语言交互开发流程

使用Node-API实现跨语言交互&#xff0c;首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧&#xff1a;实现C方法的调用。代码比较简单&#xff0c;import一个对应的so库后&#xff0c;即可调用C方法。 Native侧&#xff1a;.cpp文件&#xff0c;实现模…