first
时间复杂度 N²
空间复杂度 N+2K
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int num[20009],s[110];
int main(){
int n;
cin>>n;
memset(num,0,sizeof(num));
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
num[x]=1;
s[i]=x;
}
int sum=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(num[s[i]+s[j]]==1)sum++,num[s[i]+s[j]]++;
}
}cout<<sum;
return 0;
}
second
时间复杂度 N²logN
空间复杂度 2N
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
set<int> num;//查找集合
set<int> res;//去重集合
int a[110];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
num.insert(a[i]);
} for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int tmp=a[i]+a[j];
set<int>::iterator it =num.find(tmp);
if(it!=num.end()){
res.insert(*it);
}
}
}cout<<res.size();
return 0;
}