阿里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;
	
}
posted @ 2024-04-27 17:45  lipu123  阅读(57)  评论(0)    收藏  举报