🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
1.1 输入描述
1.2 输入限制
1.3 输出描述
1.4 测试样例
1.4.1 示例 1
二、解题思路
四、时间复杂度
一、题目描述
同一个数轴 X 上有两个点的集合 A={A1, A2, ..., Am} 和 B={B1, B2, ..., Bn}。Ai 和 Bj 均为正整数, A、B 已经按照从小到大排好序,A、B 均不为空。给定一个距离 R(正整数),列出同时满足如下条件的所有(Ai, Bj)数对:
1)Ai <= Bj
2)Ai, Bj 之间的距离小于 R。
在满足 1)2)的情况下,每个 Ai 只需输出距离最近的 Bj。
输出结果按 Ai 从小到大顺序排序。
1.1 输入描述
第一行三个正整数 m, n, R;
第二行 m 个正整数,表示集合 A;
第三行 n 个正整数,表示集合 B;
1.2 输入限制
1 <= R <= 100000, 1 <= n, m <= 100000, 1 <= Ai, Bj <= 1000000000
1.3 输出描述
每组数对输出一行 Ai 和 Bj,以空格隔开。
1.4 测试样例
1.4.1 示例 1
输入
4 5 5
1 5 5 10
1 3 8 8 20
输出
1 1
5 8
5 8
二、解题思路
本题属于简单题,在题目描述中,两个集合都已经按照大小排序,求满足:
1)Ai <= Bj
2)Ai, Bj 之间的距离小于 R。
两个条件的数对,只需要将 A 数对中的元素在 B 数对中依次比较即可(因为都已经排好序),满足条件的输出数对(Ai,Bi)。
注意:一个 Bi 可能对应多个 A 集合中的元素。
三、代码实现
代码实现如下所示。
#include <iostream>
#include <vector>
using namespace std;
void closestDistance(int m, int n, int R)
{
int val;
vector<int>g;
for (int i = 0; i < m; ++i) {
cin>>val;
g.push_back(val);
}
int idx = 0;
for (int i = 0; i < n; ++i) {
cin>>val;
while (idx < m) {
if (val >= g[idx] && val - g[idx] < R) {
cout<<g[idx]<<" "<<val<<endl;
} else if (val < g[idx]) {
break;
}
idx++;
}
}
}
int main()
{
int m, n, R;
while (cin>>m>>n>>R) {
closestDistance(m, n, R);
}
return 0;
}
四、时间复杂度
时间复杂度:O(n + 2*m)
在上述代码中,closestDistance 函数中,第一个 for 循环时间复杂度为 O(m),第二个 for 循环的时间复杂度为 O(n + m),所以总的时间复杂度为 O(n + 2m)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞