欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > leetcode_3583 统计特殊三元组

leetcode_3583 统计特殊三元组

2025/6/20 5:16:58 来源:https://blog.csdn.net/bdn_nbd/article/details/148719111  浏览:    关键词:leetcode_3583 统计特殊三元组

1. 题意

求给定数组中下标 ( i , j , k ) (i,j,k) (i,j,k)的对数, 且满足

i < j < k , 2 a [ j ] = a [ i ] = a [ k ] i < j <k,2 a[j]=a[i]=a[k] i<j<k,2a[j]=a[i]=a[k]

2. 题解

2.1 枚举中间

三个数枚举中间那个数,再存前缀和后缀个数。

class Solution {
public:int specialTriplets(vector<int>& nums) {unordered_map<int,int> left;unordered_map<int,int> right;for (int num: nums) {right[num]++;}int ans = 0;int MOD = 1e9 + 7;int sz = nums.size();for (int i = 0; i < sz ; ++i) {int v = nums[i];right[v]--;ans = ans + (int) ( (long long)left[2 * v] * right[ 2 * v] % MOD) ;ans %= MOD;left[v]++;}return ans;}
};
2.2 枚举右边,维护左边

我们用两个哈希表记录,哈希表 s 1 s_1 s1记录值为 v v v的个数;
哈希表 s 12 s_{12} s12记录序列 ( 2 v , v ) (2v,v) (2v,v)的个数。

我们从左往右遍历,对每个值 v v v v m o d 2 = = 0 v \mod 2== 0 vmod2==0, 相应的三元组个数为 s 12 { v / 2 } s_{12}\{ v / 2\} s12{v/2}

s 12 { v } s_{12}\{v\} s12{v}的值需要累加上 s 1 { 2 v } s_1\{2v\} s1{2v}

s 1 { v } s_1\{v\} s1{v}累加。注意顺序不能变,因为可能出现 0 , 0 , 0 0,0,0 0,0,0这种情况。

class Solution {
public:int specialTriplets(vector<int>& nums) {unordered_map<int,int> s1;unordered_map<int,int> s12;int MOD = 1e9 + 7;long long ans = 0;int sz = nums.size();for (int i = 0; i < sz; ++i) {int v = nums[i];if ( v % 2 == 0) {ans = (ans + s12[ v / 2]) % MOD;}s12[ v ] = ( s1[ v * 2 ] + s12[ v ] ) % MOD;s1[ v ]++;}return ans;}
};
2.3 二分

第一次遍历直接记录每个数出现的位置;

再次遍历,对于位置 j ∈ [ 1 , n − 1 ] j \in [1,n-1] j[1,n1]

查找值为 2 a [ j ] 2a[j] 2a[j]出现位置中第一个不小于 j j j的下标。

这样就可以算出 a [ j ] a[j] a[j]的左边和右 2 a [ j ] 2a[j] 2a[j]的个数

class Solution {
public:int specialTriplets(vector<int>& nums) {unordered_map<int, vector<int>> h;int n = nums.size();for ( int i = 0; i < n; ++i) {h[ nums[i] ].push_back( i );}int ans = 0;int MOD = 1e9+7;for (int i = 1; i < n - 1; ++i) {int tg = 2 * nums[ i ];auto it = std::lower_bound( h[tg].begin(), h[tg].end(), i);int ln = static_cast<int>( it - h[tg].begin());int rn = static_cast<int>( h[tg].end() - it);if (it != h[tg].end() && *it == i) rn--;ans = ans  + (long long) ln * rn % MOD;ans %= MOD;}return ans;}
};

3. 参考

03xf

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词