【算法模板】基础:区间合并

news/2024/9/18 8:00:58/ 标签: 算法, c++, 数据结构

区间合并是一种常见的算法问题,通常在处理范围覆盖、时间调度、区间覆盖等问题时会用到。区间合并的目的是将一些有重叠或相邻的区间合并成一个更大的区间,从而简化问题的复杂性。

算法思想

给定一组区间,可能存在部分区间之间有重叠或相邻关系。区间合并的目标是将这些重叠或相邻的区间合并成一个大的区间。算法的基本思想是:先将所有区间按起始点排序,然后遍历区间并逐步合并重叠或相邻的区间。

算法流程

  1. 排序区间
    • 首先,按每个区间的起始点(左端点)进行排序。如果起始点相同,可以再按终止点(右端点)排序(可选)。
  2. 初始化结果集
    • 初始化一个空的结果集,用于存放合并后的区间。
  3. 遍历区间并进行合并
    • 逐一遍历排序后的区间。对于当前遍历的区间,如果结果集是空的,或者当前区间与结果集中最后一个区间没有重叠,则直接将当前区间添加到结果集中。
    • 如果当前区间与结果集中最后一个区间有重叠,则将两个区间合并,更新结果集中最后一个区间的终止点为两个区间终止点的最大值。
  4. 输出结果
    • 遍历完成后,结果集中的区间即为合并后的区间。

算法模板

vector<pair<int, int>> mergeIntervals(vector<pair<int, int>>& vp) {vector<pair<int, int>> res; // 用于存储合并后的区间const int n = vp.size(); // 区间的数量// 如果没有区间,则直接返回空结果if (n == 0) return res;// Step 1: 按照区间的起始点进行排序// 排序的目的是让重叠的区间相邻,从而便于合并sort(vp.begin(), vp.end());// Step 2: 遍历排序后的区间并进行合并for (int i = 0; i < n; i++) {auto [l, r] = vp[i]; // 取出当前区间的起始点 l 和终止点 r// Step 3: 检查当前区间与下一个区间是否重叠// 如果下一个区间的起始点小于等于当前区间的终止点,则说明有重叠while (i + 1 < n and vp[i + 1].first <= r) {i++; // 移动到下一个区间r = max(r, vp[i].second); // 更新当前区间的终止点为两个区间终止点的最大值}// Step 4: 将合并后的区间添加到结果集中res.push_back({l, r});}// 返回合并后的区间列表return res;
}

例题

校门外的树 (nowcoder.com)

在一个长度为L的马路上,马路的两端分别位于数轴的0和L的位置。马路上种植着一排树,每两棵树之间的间隔为1米,可以认为数轴上的每个整数点(从0到L)都有一棵树,故总共有L + 1棵树。当前,有一些区域需要用来建设地铁,这些区域在数轴上的起始点和终止点均为整数。这些区域可能会有重叠的部分。在这些区域内的树木(包括区域起始和终止点上的树)需要被移走。

你的任务是计算在移走所有指定区域内的树木之后,马路上还剩下多少棵树。

#include <bits/stdc++.h>
using namespace std;int main(){int L,M;cin>>L>>M;vector<pair<int,int>> vp(M);for(auto&[l,r]:vp)cin>>l>>r;sort(vp.begin(),vp.end());vector<pair<int,int>> res;for(int i=0;i<M;i++){auto[l,r]=vp[i];while(i+1<M and vp[i+1].first<=r){i++;r = max(r, vp[i].second);}res.push_back({l,r});}int sum=L+1;for(auto[l,r]:res)sum-=(r-l+1);cout<<sum<<endl;return 0;
}

http://www.ppmy.cn/news/1516500.html

相关文章

你是如何克服编程学习中的挫折感的?——从Bug中找到成长的契机

你是如何克服编程学习中的挫折感的&#xff1f; 从Bug中找到成长的契机 在编程的世界里&#xff0c;Bug 是不可避免的。无论是初学者还是经验丰富的开发者&#xff0c;都不可能完全避免 Bug 的出现。与其视 Bug 为敌人&#xff0c;不如将其看作成长的契机。每一个 Bug 的出现&…

虚幻5|简单的设置角色受到伤害,远程攻击机关设置,制作UI,低血量UI

虚幻5|制作玩家血量&#xff0c;体力&#xff08;还未编辑&#xff0c;只用于引用&#xff09;-CSDN博客 需完成制作玩家血量及体力部分 一.给角色添加死亡动画 1.为了保证角色在播放死亡蒙太奇的时候&#xff0c;不会重新播放&#xff0c;而是保持原来倒地的姿势&#xff0…

《黑神话·悟空》是用什么编程语言开发的?

最近火爆全球的国产 3A 大作《黑神话悟空》&#xff0c;你玩了吗&#xff1f;没玩没关系&#xff0c;有人就是对游戏不感冒&#xff0c;我找了个宣发片&#xff0c;一起感受下3A大作的视觉冲击&#xff0c;而且还是我们从小听到大&#xff0c;那猴子&#x1f412;的故事。 ‌‌…

Scrum 敏捷模型、软件测试

三个角色和五大重要会议 三个角色&#xff1a;产品经理、项目经理、研发团队 五个重要会议&#xff1a;需求发布会议、计划发布会议、每日会议、演示会议 每日会议&#xff1a;昨天做了什么&#xff08; 进度&#xff09;、今天做了什么&#xff08;有目标&#xff09;、遇到…

Objective-C中的MVC架构:构建清晰、可维护的iOS应用

标题&#xff1a;Objective-C中的MVC架构&#xff1a;构建清晰、可维护的iOS应用 在iOS开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式是一种经典的设计模式&#xff0c;用于分离应用的业务逻辑、用户界面和控制逻辑&#xff0c;以提高代码的可…

Flutter-自适用高度PageView

需求 在 Flutter 中&#xff0c;PageView 是一个非常常用的组件&#xff0c;能够实现多个页面的滑动切换。然而&#xff0c;默认的 PageView 高度是固定的&#xff0c;这在展示不同高度的页面时&#xff0c;可能会导致不必要的空白或内容裁剪问题。为了使 PageView 能够根据每…

云计算环境下的等保测评要点分析

在云计算环境下进行等保测评时&#xff0c;需要关注以下几个关键点&#xff1a; 安全责任共担模型&#xff1a;明确云服务提供商&#xff08;CSP&#xff09;与云服务用户&#xff08;CSU&#xff09;之间的安全责任划分&#xff0c;确保双方在安全防护上的协同作用。 安全控制…

【笛卡尔积】深入理解笛卡尔积及其在SQL中的应用

文章目录 引言笛卡尔积的定义数学背景SQL 中的笛卡尔积 SQL 示例基础示例复杂示例使用 WHERE子句限制结果集 笛卡尔积的实际应用笛卡尔积的性能考虑性能影响 更多相关内容可查看 在一个阳光明媚的周一清晨&#xff0c;听到这个词汇突然觉得有点陌生才有了此文的诞生 引言 在数…

33. 二叉搜索树的后序遍历序列【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9833.%20%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97/README.md 面试题 33. 二…

破晓科技与神话:三防平板与《黑神话:悟空》的创新交响

当全球游戏圈因《黑神话&#xff1a;悟空》的震撼预告而沸腾&#xff0c;一款代表中国游戏顶尖制作水平的作品&#xff0c;正以它独特的文化魅力与技术创新&#xff0c;向世界宣告着中国游戏产业的崛起。 点击添加图片描述&#xff08;最多60个字&#xff09;编辑 震撼视觉体验…

nginx正向代理与反向代理功能

Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP代理服务器。它的正向代理和反向代理功能在实际工作中有广泛的应用。 正向代理 功能 正向代理是位于客户端和原始服务器之间的代理服务器。客户端&#xff08;例如浏览器&#xff09;向代理服…

记录一个iOS工程添加文件的问题

遇到一个紧急问题&#xff0c;将工程copy了一份&#xff0c;然后需要将copy工程的一个文件夹 拖到现有的工程里面&#xff0c;由于事情紧急&#xff0c;就直接从工程目录中拖拽文件夹&#xff0c; 如下图 拖过之后&#xff0c;本地项目能跑了&#xff0c;但是远端自动化构建是…

排序算法之选择排序详细解读(附带Java代码解读)

选择排序&#xff08;Selection Sort&#xff09;是一种简单且直观的排序算法。它的基本思想是&#xff1a;每一轮从未排序的部分中选出最小&#xff08;或最大&#xff09;的元素&#xff0c;放到已排序部分的末尾。通过不断地选择最小&#xff08;或最大&#xff09;元素&…

MybatisPlus:实现分页效果并解决错误:cant found IPage for args

我们在做开发使用mybatisplus 做分页查询的时候遇到了个问题&#xff1a; 继承 IPage拦截没有作用会默认分页&#xff0c;这个时候报了cant found IPage for args 错误~~~ 我们分析了下&#xff0c;其实这个问题很简单&#xff0c;是因为没有给默认值赋值&#xff0c;因为查询…

申报合肥市各区县高新技术企业认定奖励补助政策

&#xff08;一&#xff09;合肥市 对首次认定为国家高新技术企业给予10万元奖励&#xff0c;并落实国家各项税收优惠支持政策。对符合条件的入库国家科技型中小企业&#xff0c;按符合加计扣除条件的研发费用10%&#xff0c;给予10万元—50万元补贴。 &#xff08;政策来源&…

鸿蒙高级开发者认证题库(2)

20.项目需要为不同的设备形态(如手机、智能手表)提供定制化构建。请说明如何在DevEco studio中设置不同的构建配置&#xff0c;以生成针对不同设备的hap包? A.在工程级别build-profile.ison5定义多个 product&#xff0c;在每个product的config/deviceType中定义不同的设备类…

攻防世界 1000次点击

做题笔记。 下载解压 查壳。 32位ida打开。 查找字符串。 winmain函数写的&#xff0c;程序运行如下&#xff1a; 一开始思路是想着分析找到关键代码然后去od进行调试。 后来&#xff0c;额&#xff0c;不想看代码了。吐了。 尝试去字符串搜索flag样式&#xff0c;确实一发现…

数据结构(6_3_1)——图的广度优先遍历

树和图的广度优先遍历区别 树的广度优先遍历&#xff1a; 图的广度优先遍历&#xff1a; 代码&#xff1a; 注:以下代码只适合连通图 #include <stdio.h> #include <stdbool.h>#define MAX_VERTEX_NUM 100typedef struct ArcNode {int adjvex; // 该边所指向的顶…

链表(含代码)

好久没更新了&#xff0c;今天浅浅更新一下。 今天给大家主要分享一下链表的一些知识。 链表的首先方式主要有两种&#xff0c;一种是结构体加指针&#xff0c;另一种是拿数组模拟链表。 一、结构体加指针&#xff08;每次都要调用new Node&#xff08;&#xff09;函数&…

优化|计算合作博弈的成本分摊

原文&#xff1a; Caprara, A., & Letchford, A. N. (2010). New techniques for cost sharing in combinatorial optimization games. Mathematical programming, 124, 93-118. https://doi.org/10.1007/s10107-010-0357-7. 原文作者&#xff1a; Alberto Caprara, Adam N…