【发布时间】:2021-11-29 13:22:02
【问题描述】:
我收到 SEGMENTATION FAULT,因为错误有人可以帮我找出我的错误, 我意识到这不是最优化的代码,任何建议都会有所帮助,谢谢
问题:
给定两个数组a[] 和b[],大小分别为n 和m。任务是找到这两个数组之间的联合。
两个数组的并集可以定义为包含两个数组中不同元素的集合。如果有重复,则只应在联合中打印一次出现的元素。
示例 1:
输入:
5 3
1 2 3 4 5
1 2 3
输出:
5
解释:
1、2、3、4 和 5 是 联合集中的元素 两个数组。所以计数是 5。
示例 2:
输入:
6 2
85 25 1 32 54 6
85 2
输出:
7
说明: 85、25、1、32、54、6 和 2是进来的元素 两个数组的联合集。所以计数是7。 你的任务: 完整的 doUnion 函数,以 a、n、b、m 为参数并返回两个数组的联合元素的计数。打印由驱动代码完成。
约束:
1 ≤ n, m ≤ 105
0 ≤ a[i], b[i] < 105
预期时间复杂度:O((n+m)log(n+m)) 预期辅助空间:O(n+m)
我的回答:
//Function to return the count of number of elements in union of two arrays.
int doUnion(int a[], int n, int b[], int m) {
//code here
int mac;
if(a[n-1]>=a[n-2] && a[n-2]>=a[n-3]){
mac=a[n-1];
}else{
mac=a[0];
}
int mab;
if(b[m-1]>=b[m-2] && b[m-2]>=b[m-3]){
mab=b[m-1];
}else{
mab=b[0];
}
// cout<<mac<<" "<<mab<<endl;
int ma = max(mac,mab);
int ptr[ma+1]={0};
for(int i = 0;i<n;i++)
{
ptr[a[i]]++;
}
for(int i=0;i<m;i++)
{
ptr[b[i]]++;
}
int u=0;
for(int i=0;i<=ma;i++){
if(ptr[i]>0)
{
// cout<<i<<endl;
u++;
}
}
return u;
}
【问题讨论】:
-
C++ 已经提供了这个特性,q.v. set_intersection.
-
所以让我们看看:
{100}, 1, {101}, 1segfaults on a[-2] access(为什么还要尝试呢?),如果没有,它会尝试分配大小为 102 的ptr(这也不是预期的辅助尺寸)。 (插入关于可变长度数组不是有效的 C++ 的强制性说明)你确定你不想考虑一下你在做什么吗? -
sorted这个词在标题中徘徊,但考虑到问题主体,感觉有点孤独。输入是否实际排序?这确实对解决方案产生了影响。我们可以有一个包含一些数据的minimal reproducible example 吗? -
实际上,如果它是预先排序的,您可以在 O(n+m) 时间内使用 O(1) 辅助空间来完成此操作。所以我认为标题是错误的。 “预期时间复杂度:O((n+m)log(n+m)) 预期辅助空间:O(n+m)”建议“将所有内容复制到一堆,排序,计数唯一数字”作为预期解决方案。
-
使用向量会容易得多。
标签: c++ algorithm data-structures