区间合并(超详细逐步讲解/例题/思路分析/参考代码)

区间合并超详解

  • 区间合并是什么?
  • 例1
    • 问题描述
    • 输入
    • 输出
    • 数据规模
    • 输入输出
      • 思路分析
      • 代码
  • 例2
    • 问题描述
    • 输入
    • 输出
    • 数据规模
    • 输入输出
      • 思路分析
      • 代码
  • 例3
    • 问题描述
    • 输入
    • 输出
    • 输入输出
      • 思路分析
      • 代码
  • 例4
    • 问题描述
    • 输入
    • 输出
    • 输入输出
      • 参考代码

区间合并是什么?

我们要了解区间合并是什么,首先来看这样的一个例子。在这里插入图片描述
区间2是区间1的一个子区间
区间3和区间1有交集
区间4和区间1端点在同一个点上
区间5和区间1没有交集
所以区间2,3,4都可以和区间1合并形成一个新的区间,区间5则不行。
总结:区间合并就是把多个区间有交集的部分,快速进行合并。
接下来我们通过一个例子来快速体验一下区间合并

例1

问题描述

给定2个闭区间 [a1,b1],[a2,b2],判断这两个区间能否合并成为一个新的区间。
任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1,2] 和 [2,3] 可以合并为[1,3] ;[1,3] 和 [2,4] 可以合并为 [1,4],但是 [1,2] 和 [3,4] 不可以合并。
我们的任务是判断这两个区间是否可以最终合并为一个闭区间,如果可以,输出 Yes,否则输出 No。

输入

一共两行。
第一行两个整数a1,b1 ,表示第一个区间。
第二行两个整数 a2,b2,表示第二个区间。

输出

两个区间是否可以最终合并为一个闭区间,如果可以,输出 Yes,否则输出 No。

数据规模

-1018 <=a1,b1,a2,b2<=1018

输入输出

样例1
输入:
1 2
2 3
输出:
Yes
样例2
输入:
3 5
8 9
输出:
No
样例3
输入:
3 8
1 3
输出:
Yes

思路分析

对于这题因为只有两个区间,我们只需要将区间进行排序确保第一个区间的左端点是最小的,然后判断第一个区间的右端点是否小于第二个区间的左端点就好了。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int main(void)
{
	vector<pair<long long, long long>> segs;//用一个二元组来存放输入,因为数据量比较大所以用long long 类型。
	for (int i = 0; i < 2; i++)
	{
		long long st, ed;
		scanf("%lld%lld", &st, &ed);
		segs.push_back({ st,ed });
	}
	sort(segs.begin(), segs.end());//对区间进行排序,确保第一个区间的左端点是最小的
	if (segs[0].second < segs[1].first) cout << "No" << endl;//只要大于或者等于都是可以合并的
	else cout << "Yes" << endl;
	return 0;
}

在了解了一个例子之后,大家对区间合并一定都有了一定的认识,接下来我们通过另一个例子来加深对区间合并的了解。

例2

问题描述

给定2个闭区间 [a1,b1],[a2,b2],判断这两个区间能否合并成为一个新的区间。
任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1,2] 和 [2,3] 可以合并为[1,3] ;[1,3] 和 [2,4] 可以合并为 [1,4],但是 [1,2] 和 [3,4] 不可以合并。
我们的任务是判断这两个区间是否可以最终合并为一个闭区间,如果可以,输出合并的新区间,否则输出-1 。

输入

一共两行。
第一行两个整数a1,b1 ,表示第一个区间。
第二行两个整数 a2,b2,表示第二个区间。

输出

如果可以合并,输出合并后的新区间坐标。如果不可以,输出 -1。

数据规模

-1018 <=a1,b1,a2,b2<=1018

输入输出

样例1
输入:
1 2
2 3
输出:
1 3
样例2
输入:
3 8
1 3
输出:
1 8
样例3
输入:
3 5
8 9
输出:
-1

思路分析

这题和上题的区别就是这题如果可以合并,那我们就需要输出新区间的左右端点了,所以我们只需要把最小的左端点和最大的右端点给记录下来就好了,对于最小的左端点就是第一个区间的左端点,因为我们在判断之前就已经对数据进行了排序,确保了第一个区间的左端点是最小区间。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int main(void)
{
	vector<pair<long long, long long>> segs;
	for (int i = 0; i < 2; i++)
	{
		long long st, ed;
		scanf("%lld%lld", &st, &ed);
		segs.push_back({ st,ed });
	}
	sort(segs.begin(), segs.end());
	if (segs[0].second < segs[1].first) cout << -1 << endl;
	else
	{
		long long x = segs[1].second > segs[0].second ? segs[1].second : segs[0].second;//把最大的右端点更新一下
		cout << segs[0].first << ' ' << x << endl;
	}
	return 0;
}

通过这一个例子之后,大家对区间合并一定有了更深的认识,接下来我们通过一个例子来学会如何处理2个以上的区间

例3

问题描述

给定n个闭区间 [ai,bi],其中i = 1,2,…,n。
任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1,2] 和 [2,3] 可以合并为[1,3] ;[1,3] 和 [2,4] 可以合并为 [1,4],但是 [1,2] 和 [3,4] 不可以合并。
我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出 no。

输入

第一行为一个整数n(3<= n <=50,000) 。表示输入区间的数量。
之后 n 行,在第 i(1<=i<=n) 行上,为两个整数 ai,bi,整数之间用一个空格分隔,表示区间 [ai,bi](其中 1 <= ai <= bi <= 10,000)。

输出

输出一行,如果这些区间最终可以合并为一个闭区间,输出这个闭区间的左右边界,用单个空格隔开;否则输出 no。

输入输出

样例1
输入:
5
5 6
1 5
10 10
6 9
8 10
输出:
1 10

思路分析

对于这题,我们只需要遍历一下所有的区间,当其中有一个区间的右端点小于它下一个区间的左端点说明就不能合并成一个区间,每次迭代之后更新一下右端点的值为最大的那个就好了。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int main(void)
{
	int n;
	cin >> n;
	vector<pair<int, int>>segs;//用一个二元组来存储输入
	for (int i = 0; i < n; i++)
	{
		int st, ed;
		scanf("%d%d", &st, &ed);
		segs.push_back({ st,ed });
	}
	int st = 1e8, ed = -1e8;//确保第一个区间一定小于初始值
	sort(segs.begin(), segs.end());
	st = segs[0].first;//因为已经排过序了,所以第一个区间的左端点是最小的
	bool sign = true;//标记一下是否可以合并
	for (auto seg : segs)
	{
		if (st > seg.first) st = seg.first;
		if (ed < seg.first && ed != -1e8) {//如果有某个区间的右端点小于它的下一个区间的左端点那就表示不能合并
			cout << "no" << endl;
			sign = false;//标记一下然后退出循环
			break;
		}
		else {
			 ed = seg.second;
		}
	}
	if (sign) cout << st << ' ' << ed << endl;
	return 0;
}

相信大家都已经掌握了区间合并,接下来我们来通过一个例子检验一下~

例4

问题描述

给定 n 个区间 [li,ri],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。
输出合并完成后的区间个数。
例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。

输入

第一行包含整数 n(1<=n<=100,000)。
接下来 n 行,每行包含两个整数 l 和 r。第 i 行的两个数据表示 li,ri,(-109<=li<=ri<=109)。

输出

共一行,包含一个整数,表示合并区间完成后的区间个数。

输入输出

样例1
输入:
5
1 2
2 4
5 6
7 8
7 9
输出:
3

参考代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;

vector<pair<int,int>>  merges(vector<pair<int, int>> segs)
{
	vector<pair<int, int>> temp;
	int st = -1e9, ed = -1e9;
	sort(segs.begin(), segs.end());
	for (auto seg : segs)
	{
		if (ed < seg.first)
		{
			if (ed != -1e9) temp.push_back({ st,ed });
			st = seg.first; ed = seg.second;
		}
		else ed = max(ed, seg.second);
	}
	if (st != -1e9) temp.push_back({ st,ed });
	return temp;
}

int main(void)
{
	int n;
	cin >> n;
	vector<pair<int, int>>segs;
	for (int i = 0; i < n; i++)
	{
		int l, r;
		scanf("%d%d", &l, &r);
		segs.push_back({ l,r });
	}
	auto t = merges(segs);
	cout << t.size() << endl;
	return 0;
}

欢迎大家评论区讨论和交流哦~ 有我没说清楚的地方可以私信问我。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载中心-异步下载

下载中心 文章目录 下载中心一. 概要二. 实现逻辑 下载中心一. 概要二. 实现逻辑三. 主要代码逻辑1.生成任务2.消费任务3.查询方法是如何存入内存中的4.DCGenerateComponent 反射调用查询数据方法 总结 一. 概要 功能概览&#xff1a;将文件下载修改为异步下载&#xff0c;引入…

Ubuntu18.04安装RTX2060显卡驱动+CUDA+cuDNN

Ubuntu18.04安装RTX2060显卡驱动CUDAcuDNN 1 安装RTX2060显卡驱动1.1 查看当前显卡是否被识别1.2 安装驱动依赖1.3 安装桌面显示管理器1.4 下载显卡驱动1.5 禁用nouveau1.6 安装驱动1.7 查看驱动安装情况 2 安装CUDA2.1 查看当前显卡支持的CUDA版本2.2 下载CUDA Toolkit2.3 安装…

1.4 Word2Vec是如何工作的? Word2Vec与LDA 的区别和联系?

1.4 Word2Vec&#xff1a;词嵌入模型之一 场景描述 谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。 Word2Vec实际是一种浅层的神经网络模型,它有两种网络结构&#xff0c;分别是CBOW(Continues Bag of Words)和Skip-gram。 知识点 Word2Vec,隐狄利克雷模型(LDA),…

软件测试之接口测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组…

通信网优岗位真实面经分享!

春招来临&#xff0c;不少网优人已经踏上了面试的征程。网优面试具体涉及哪些环节&#xff1f;主要问题有哪些&#xff1f; 本文收集并整理已经获得高薪offer的优橙学员的相关简历&#xff0c;为正在投递网优岗位的你提供经验&#xff0c;也希望网优人能早日找到满意工作。 通信…

uniapp 滑动页面至某个元素或顶部

直接上代码&#xff1a; uni.pageScrollTo({selector: #top, // 需要返回顶部的元素id或class名称duration: 300 // 过渡时间&#xff08;单位为ms&#xff09; }); 官方文档&#xff1a;

计及电池储能寿命损耗的微电网经济调度(matlab代码)

目录 1 主要内容 储能寿命模型 负荷需求响应 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约…

【C++进阶】用哈希表封装unordered_set和unordered_map

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

算法:滑动窗口

文章目录 例题1&#xff1a;长度最小的子数组例题2&#xff1a;无重复字符的最长子串例题3&#xff1a;最大连续1的个数 III例题4&#xff1a;将 x 减到 0 的最小操作数例题5&#xff1a;水果成篮例题6&#xff1a;找到字符串中所有字母异位词例题7&#xff1a;串联所有单词的子…

网络工程技术-学习内容(非技术文)

公共基础双纹线的制作 认识网络环境 (1)ipv4 ipv4地址的构成&#xff0c;分类&#xff0c;子网刻分&#xff0c;超丽素合“ 交换机的基本配置telnet&#xff0c;ssh&#xff0c; web方式三种配置 van. sto.协议 VLAN 端口聚合 三层交换“ 路由器的基本配置《(端口 IP 地址配)《…

msvcp120.dll丢失的解决方法,教你快速解决msvcp120.dll问题

msvcp120.dll是一个在Windows操作系统中至关重要的系统文件&#xff0c;它属于Microsoft Visual C Redistributable Package的一部分。这个动态链接库文件&#xff08;DLL&#xff09;包含了运行某些应用程序所必需的C运行时库函数。当某个程序在运行过程中需要调用这些预先编译…

requests做接口测试

Requests 是用Python语言编写&#xff0c;基于 urllib&#xff0c;采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便&#xff0c;可以节约我们大量的工作&#xff0c;完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的&#xff0c;所以它…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多&#xff0c;kafka、rabbitmq、RocketMq、activeMq、Redis&#xff08;非专业&#xff09;&#xff0c;各有各的特点和优缺点。但是之前的公司数据需求规模并非很大&#xff0c;所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…

工业网关、物联网网关与PLC网关是什么?

网关是什么&#xff1f; 网关是一种用于连接不同网络的网络设备&#xff0c;其作用是实现网络之间的通信和数据交换。它负责将一个网络的数据转发到另一个网络&#xff0c;并且可以进行路由、转换和过滤等处理。通常用于连接局域网和广域网之间&#xff0c;可以是硬件设备或者软…

基于javaweb实现的学生选课系统

一、系统架构 前端&#xff1a;jsp | bootstrap | jquery | css 后端&#xff1a;spring | sprinmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | tomcat 二、代码及数据库 三、功能介绍 01. 登录页 02. 管理员-课程管理 03. 管理员-学生管理 04. 管…

网络编程:select、poll

.1、select完成TCP并发服务器 程序代码&#xff1a; #include <myhead.h> #define SER_IP "192.168.125.234" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfds…

C#,电话数字键盘问题(Mobile Numeric Keypad problem)的算法与源代码

1 电话数字键盘问题 提供移动数字键盘。您只能按向上、向左、向右或向下至当前按钮的按钮。不允许您按最下面一行的角点按钮&#xff08;即.*和#&#xff09;。 移动键盘 给定一个数N&#xff0c;找出给定长度的可能数。 示例&#xff1a; 对于N1&#xff0c;可能的数字数为…

免费SSL证书有效期

免费SSL证书有效期现状 目前市场上主流的免费SSL证书提供商大多遵循行业规范&#xff0c;将免费证书的有效期设为3个月。这意味着每隔三个月&#xff0c;网站管理员必须重新申请、验证并安装新的SSL证书&#xff0c;以维持网站的HTTPS安全连接状态。这种做法已成为行业的常态&…

GEE入门篇|图像分类(一):非监督分类

在非监督分类中&#xff0c;我们有与监督分类相反的过程。 首先对光谱类进行分组&#xff0c;然后将其分类为簇。因此&#xff0c;在 Earth Engine 中&#xff0c;这些分类器是 ee.Clusterer 对象。 它们是“自学”算法&#xff0c;不使用一组标记的训练数据&#xff08;即它们…

C++复习笔记——泛型编程模板

01 模板 模板就是建立通用的模具&#xff0c;大大提高复用性&#xff1b; 02 函数模板 C另一种编程思想称为 泛型编程 &#xff0c;主要利用的技术就是模板 C 提供两种模板机制:函数模板和类模板 函数模板语法 函数模板作用&#xff1a; 建立一个通用函数&#xff0c;其函…