#include <bits/stdc++.h>
using namespace std;
int main()
{
int N,K;
cin>>N;
int a[N];
for(int i=0;i<N;i++){
cin>>a[i];
}
cin>>K;
int b[K],c[K]={0};
for(int i=0;i<K;i++){
cin>>b[i];
}
for(int i=0;i<N;i++){
for(int j=0;j<K;j++){
if(a[i] == b[j]){
c[j]++;
break;
}
}
}
for(int i=0;i<K;i++){
cout<<c[i];
if(i!=K-1){
cout<<" ";
}
}
cout<<endl;
return 0;
}
这是拿14分超时的代码。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N, K;
cin >> N;
vector<int> a(N);
for (int i = 0; i < N; i++) {
cin >> a[i];
}
cin >> K;
vector<int> b(K);
unordered_map<int, int> freq;
for (int i = 0; i < K; i++) {
cin >> b[i];
freq[b[i]] = 0;
}
for (int i = 0; i < N; i++) {
if (freq.find(a[i]) != freq.end()) {
freq[a[i]]++;
}
}
for (int i = 0; i < K; i++) {
cout << freq[b[i]];
if (i != K - 1) {
cout << " ";
}
}
cout << endl;
return 0;
}
这是速度优化后的代码,时间从>250超时到42
优化如下:
-
使用unordered_map:使用unordered_map作为哈希表来统计元素出现的次数。unordered_map具有常数时间复杂度的查找操作,与原使用的线性查找相比,可以显著提高查找的效率,从线性查找的O(K)时间复杂度降低到常数时间复杂度O(1)。
-
使用vector代替数组:将原生数组替换为了vector。vector提供了动态调整大小和较高的访问速度,因此在某些情况下可以比原生数组更有效率。
-
使用cout代替printf:使用了C++标准库的cout进行输出,相比于C语言的printf函数,cout可以更高效地执行输出操作。