求集合交集

给定两个整数集合(每个集合中没有重复元素),集合元素个数<=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)便成功通过。以后考虑运行超时的问题可以优先往这样的方向先考虑。

猜你喜欢

转载自www.cnblogs.com/fengwanthousand/p/10545984.html