【华为上机真题】区间交集

news2025/1/16 11:17:06

🎈 作者: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 <iostream>
#include <vector>
#include <algorithm>
using namespace std;

typedef vector<pair<int, int>> VectPair;

bool cmp(pair<int, int>a, pair<int, int>b)
{
    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<int, int>(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<int, int>(u, v));
            u = in[i].first;
            v = in[i].second;
        }
    }
    // 不要忘记添加
    ans.push_back(pair<int, int>(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<int, int>(u, v));
        }
        auto ans = intervalMerge(g);
        int n = ans.size();
        if (n == 0) {
            cout<<"None"<<endl;
        } else {
            for (int i = 0; i < n; ++i) {
                cout<<ans[i].first<<" "<<ans[i].second<<endl;
            }
        }
    }
    return 0;
}

四、时间复杂度

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

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


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


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

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

相关文章

CleanMyMac X真的有必要买吗?CleanMyMac2023最新版下载

CleanMyMac X是一款集所有功能于一身的先进程序卸载清理器&#xff0c;只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac为您喜爱的东西腾出空间。它不仅有着赏心悦目的UI交互页面&#xff0c;更有着强大的“超能力…

HTB-BountyHunter

HTB-BountyHunter信息收集开机提权信息收集 80端口的网页如下。 注意有一个db.php&#xff0c;虽然现在打不开&#xff0c;估计后面会用上。 还有resources里面的readme文件。 完成了tracker提交编写和developer组权限。没有完成portal的test用户禁用、选择哈希加密的密码以…

Webshell(网页后门)

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 一、Webshell简介 01 什么是 Webshell webshell是以 asp、php、jsp或者cgi等网页文…

【数据结构与算法】第十九篇:回溯,剪枝,N皇后问题

知识导航一、回溯思想概述二、八皇后问题引入八皇后问题的解决思路(1)思路一&#xff1a;暴力出奇迹(2&#xff09;思路二&#xff1a;根据题意减小暴力程度(3&#xff09;思路三&#xff1a;回溯法剪枝三、四皇后问题八皇后问题四、N皇后的实现1.实现方法一&#xff1a;利用数…

程序员的自我修养第七章——动态链接 (上)

继续更新《程序员的自我修养》这个系列&#xff0c;主要是夏天没把它看完&#xff0c;补上遗憾。本篇来自书中第七章。 再说动态链接前&#xff0c;我们先阐明为什么要动态链接&#xff1a; 动态链接的产生来自静态链接的局限性。随着静态链接的发展&#xff0c;其限制也越来越…

十二、创建和管理表

文章目录一、基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 数据类型及数据库操作二、创建表三、查看表结构3.1 使用 SHOW COLUMNS 语句查看3.2 使用 DESCRIBE 语句查看3.3 查看表详细结构语句 SHOW CREATE TABLE四、修改表结构4.1 添加新字段和修改字段定义4.2 修改字…

用户画像增量更新系列二

进行用户日志数据处理 原始日志数据 结果: 思路&#xff1a;按照user_id的行为一条条处理&#xff0c;根据用户的行为类型判别。 由于sqlDF每条数据可能会返回多条结果&#xff0c;我们可以使用rdd.flatMap函数或者yield 格式&#xff1a;["user_id", "action…

总结:计算机中字符串比较大小的规则

总结&#xff1a;计算机中字符串比较大小的规则一背景&#xff1a;二Unicode编码表&#xff1a;字符越靠后&#xff0c;对应的十进制值越大三单个字符之间比较规则&#xff1a;四案例演示&#xff1a;单个字符与单个字符之间比较大小1.前提&#xff1a;汉字“一”与汉字“万”&…

Elasticsearch:Elasticsearch percolate 查询

Elasticsearch 通常如何工作&#xff1f; 我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入&#xff0c;匹配查询的文档作为结果返回。 但这不是 percolate query 的情况..... 让我们看看这篇文章中的 p…

10.Java方法学习知识点大全

文章目录前言一、什么是方法1.什么是方法?2.实际开发中,什么时候用到方法?3.实际开发中,方法有什么好处?二、最简单的方法定义和调用1.方法的格式2.方法的调用3.看代码说结果4.为什么要有带参数的方法呢?三、带参数的方法定义和调用1.带参数的方法定义和调用2.形参和实参3.…

NuSphere PhpED Pro 19.5 Crack

PhpED是PHP&#xff08;PHP IDE&#xff09;&#xff0c;HTML&#xff0c;CSS&#xff0c;XML&#xff0c;SMARTY&#xff0c;XHTML等的I ntegated Development Environment。 高级代码编辑器、可靠的 dbg 调试器、高效的数据库连接客户端以及快速安全的部署能力的平衡组合使 P…

90. 注意力分数及代码实现

1. 注意力分数 2. 拓展到高维度 3. Additive Attention ps&#xff1a; 这种的好处是&#xff0c;key&#xff0c;value&#xff0c;query的长度可以不一样 4. Scaled Dot-Product Attention n个query&#xff0c;m个key-value 对最后的结果是n x m的矩阵&#xff0c;第i行就表…

LeetCode[684]冗余连接

难度&#xff1a;中等题目&#xff1a;树可以看成是一个连通且 无环 的 无向 图。给定往一棵 n个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1到 n中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n的二维数组…

Python 压缩 css 文件,第三方模块推荐

本篇博客为大家详细介绍一下如何在 Python 中压缩 CSS 文件。 正式开始前&#xff0c;需要准备一个未压缩过的 CSS 文件。 Python 压缩 csscsscompressor 库使用在 Flask 中压缩 css 文件cssmin 库的用法rcssmin 库的用法总结csscompressor 库使用 在 Python 中可以使用多种方…

CSS之浮动以及清除浮动的几种方式

一. 什么是 CSS Float&#xff08;浮动&#xff09; CSS 的 Float&#xff08;浮动&#xff09;&#xff0c;会使元素向左或向右移动&#xff0c;其周围的元素也会重新排列。 Float&#xff08;浮动&#xff09;&#xff0c;往往是用于图像&#xff0c;但它在布局时一样非常有…

【大数据管理】Java实现字典树TireTree

实现字典树&#xff0c;支持插入和删除&#xff0c;能够打印每一层的数据示例数据“SJ”, “SHJ”, “SGYY”,"HGL" ,将这些数据插入前缀树&#xff0c;打印树&#xff0c;修改SHZ为SHHZ 解题思路 Trie树即字典树&#xff0c;又称单词查找树或键树&#xff0c;是一…

Linux下进程控制详解

目录 一、进程创建 1.1 初识fork 1.2 函数返回值 1.3 写时拷贝技术 1.4 fork函数的使用场景 1.5 fork函数的失败原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.3 进程正常退出方法 2.3.1 exit函数 2.3.2 _exit函数 2.3.3 return方法 2.3.4 方法分析对比 …

【LINUX修行之路】——工具篇gcc/g++的使用和自动化构建工具make/makefile

学习范围&#xff1a;✔️LINUX ✔️ gcc/g✔️make/makefile作者 &#xff1a;蓝色学者 文章目录一、前言二、概念什么是gcc/g&#xff1f;什么是make/makefile&#xff1f;三、教程3.1gcc/g命令3.2make/makefile依赖关系依赖方法编写makefile文件四、资源一、前言 欢迎大家来…

谷粒学院——Day20【项目总结】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

计算机组成原理实验-logisim实现自动售糖机

一.作业内容; 二.设计分析&#xff1a; 首先我们先确定输入和输出&#xff0c;根据题目的提示很明显可以看出因为每次可以投入10元或者5元硬币&#xff0c;当总钱数达到15元或者超过15元的时候&#xff0c;自动出糖&#xff0c;并且机器不找零&#xff0c;所以可以看出最大的钱…