阿里2023春招实习-合法的三元组(哈希表+数学)
https://oj.algomooc.com/problem.php?id=5303
给定一个数组,请你计算有多少个三元组满足
\(<i,j,k>\)满足\(0≤i<j<k<n\)且
\(max(a_i,a_j,a_k) − min(a_i,a_j,a_k)=1\)
输入
第一行输入一个正整数n
第二行输入n个正整数\(a_i\)
\(3 ≤ n ≤ 200000\)
\(1 ≤ a ≤ 10^9\)
输出
一个整数,代表合法的三元组数量。
样例输入
4
2 2 3 1
样例输出
2
提示
一共有两组符合要求的三元组,分别是2 2 3和2 2 1
观察max - min = 1,那么三元组中 必定有两个元素相等 ,结构如下两种
情况1 x-1,x,x
情况2 x-1,x-1,x
那么我们可以使用一个map先统计每个数出现的次数。然后枚举每一个值x.
第一种情况的贡献: \(C(d[x] , 2) * d[x-1]\),C是组合数
第二种情况的贡献: \(C(d[x-1] , 2) * d[x]\),C是组合数
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
typedef long long ll;
using namespace std;
const int maxn=1e6+100;
int n;
ll a[maxn];
ll ans=0;
map<ll,ll>mp;
set<ll>s;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]++;
s.insert(a[i]);
}
for(auto x:s){
ans+=(mp[x]*(mp[x]-1)/2*mp[x-1]);
ans+=(mp[x-1]*(mp[x-1]-1)/2*mp[x]);
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号