【华为上机真题】区间交集
创始人
2024-05-16 14:37:27
0

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

1.3.1 示例 1

1.3.2 示例 2

1.3.3 示例 3

二、解题思路

三、代码实现

四、时间复杂度


一、题目描述

给定一组闭区间,其中部分区间存在交集。任意两个给定区间的交集,称为公共区间(如:[1,2], [2,3] 的公共区间为 [2,2], [3,5], [3,6] 的公共区间为 [3,5])。公共区间之间若存在交集,则需要合并(如:[1,3], [3,5]区间存在交集 [3,3],需要合并为[1,5])。按升序排列输出合并后的区间列表。

1.1 输入描述

一组区间列表, 区间数为 N,0 <= N <= 10000。

1.2 输出描述

升序排列的合并后的区间列表

1.3 测试样例

1.3.1 示例 1

输入

4
0 3
1 3
3 5
3 6

输出

1 5

说明:[0,3] 和 [1,3] 的公共区间为 [1,3],[0,3] 和 [3,5] 的公共区间为 [3,3],[0,3] 和 [3,6] 的公共区间为 [3,3], [1,3] 和 [3,5] 的共区间为 [3,3],[1,3] 和 [3,6] 的共区间为 [3,3], [3,5] 和 [3,6] 的公共区间为 [3,5], 公共区间列表为 [[1,3], [3,3], [3,5]],他们合并后的区间为[1,5]。

1.3.2 示例 2

输入

4
0 3
1 4
4 7
5 8

输出

1 3
4 4
5 7

1.3.3 示例 3

输入

2
1 2
3 4

输出

None

说明:[1,2] 和 [3,4] 没有交集。

备注:区间元素均为数字,不考虑字母、符号等异常输入;单个区间认定为无公共区间。

二、解题思路

本题主要考查区间合并算法,首先,需要计算两两集合的交集,对计算出的交集进行排序,最后采用贪心的区间合并算法合并有交集的区间即可。

假设交集的区间为(ui, vi),那么区间合并算法为:

(1)设置初始化区间 (u, v) 用于记录合并后的大区间;

(2)合并区间 (ui, vi) 时,如果 v >= ui && v <= vi 那么,更新 v = vi;

(3)否则,如果 v < ui,那么,区间无法合并,更新 u = ui, v = vi;

因为待合并的区间(ui, vi)已经按照 ui <= uj 进行了排序,所以不用考虑 uj > ui 的情况。

三、代码实现

代码实现如下所示。

#include 
#include 
#include 
using namespace std;typedef vector> VectPair;bool cmp(paira, pairb)
{if (a.first != b.first) {return a.first < b.first;}return a.second < b.second;
}VectPair intervalMerge(VectPair g)
{// 先计算交集int n = g.size();VectPair in;for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (g[i].second >= g[j].first) {in.push_back(pair(g[j].first, g[i].second));}}}// 处理没有交集的情况if (in.size() == 0) {return {};}// 交集排序sort(in.begin(), in.end(), cmp);// 交集合并VectPair ans;n = in.size();int u = in[0].first;int v = in[0].second;for (int i = 1; i < n; ++i) {if (v >= in[i].first && v <= in[i].second) {v = in[i].second;} else if (v < in[i].first) {ans.push_back(pair(u, v));u = in[i].first;v = in[i].second;}}// 不要忘记添加ans.push_back(pair(u, v));return ans;
}int main()
{int n;while (cin>>n) {VectPair g;int u, v;for (int i = 0; i < n; ++i) {cin>>u>>v;g.push_back(pair(u, v));}auto ans = intervalMerge(g);int n = ans.size();if (n == 0) {cout<<"None"<

四、时间复杂度

时间复杂度:O(n^2 + mlogm + m)

在上述代码中,n 表述输入的集合数量,m 表示交集数量。那么,求所有集合两两交集的时间是 O(n^2),交集排序的时间复杂度为 O(mlogm),最后,交集合并的时间复杂度为 O(m)。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...