给定两个整数集合(每个集合中没有重复元素),集合元素个数<=100000,求两集合交集,并按非降序输出。
输入格式:
第一行是n和m,表示两个集合的元素个数; 接下来是n个数和m个数。
输出格式:
第一行输出交集元素个数; 第二行按非降序输出交集元素,元素之间以空格分隔,最后一个元素后面没有空格。
输入样例:
在这里给出一组输入。例如:
5 6
8 6 0 3 1
1 8 9 0 4 5
输出样例:
在这里给出相应的输出。例如:
3
0 1 8
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{ int n,m;
int a[100000],b[100000],c[200000];//定义数组
cin>>n>>m;//
for (int i=0; i < n; ++i)
cin>>a[i];
for (int i=0; i < m; ++i)
cin>>b[i];//输入指定的数组数据
sort(a,a+n);
sort(b,b+n);//对数组数据进行排序
int i=0,j=0,k=0;
for (; i<n && j<m;) //判断两个数组的数据大小,用数组c记录下相同的数据,并记录好相等的次数(有多少个交集)
{
if (a[i]==b[j])
c[k++]=a[i],i++,j++;
else
if (a[i]<b[j])
i++;
else
j++;
}
cout<<k<<endl;
for (int i=0; i < k; ++i)
{
cout<<c[i];//输出数组,按照要求取好空格与最后没有空格
if(i!=k-1)
{ cout<<" ";}
}
return 0;
}
此题个人觉得难度在于缩短其时间复杂度,一开始想到的算法运行起来的时间复杂度为O(n^2),由于数据量较大,运行超时,所以考虑的算法是先将数组排好序,再对比取交集。
将时间复杂度降到O(n*logn)便成功通过。以后考虑运行超时的问题可以优先往这样的方向先考虑。