C++组合
你收集了 n 张卡片,按照收集的时间顺序编号 1 到n 并依次排列,每张卡片上标有一个数值。现在突发奇想,想知道在这些卡片中,若每次挑选两张卡片,会有多少对不同的组合满足两张卡片的数值和恰好为 0,请你计算出符合条件的卡片组合的数量。
朴素:
#include <bits/stdc++.h>
using namespace std;
int a[10000];
int n;
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>a[i];}int cnt=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(a[i]+a[j]==0) cnt++;}}cout<<cnt;return 0;
}
双指针:
#include <bits/stdc++.h>
using namespace std;
int a[10000];
int n;
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>a[i];}sort(a+0,a+n);int i=0;int j=n-1;int cnt=0;while(i<j){if(a[i]+a[j]==0){cnt++;i++;j--;}else if(a[i]+a[j]>0){j--;}else if(a[i]+a[j]<0){i++;}}cout<<cnt;return 0;
}