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