求集合交集


給定兩個整數集合(每個集合中沒有重復元素),集合元素個數<=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)便成功通過。以后考慮運行超時的問題可以優先往這樣的方向先考慮。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM