1. 题目来源
链接:1726. 同积元组
2. 题目解析
计数问题。没看清题,一直再考虑怎么去重,结果题目要求无重复元素…周赛颇为不顺。
思路:
- 哈希表记录所有乘积出现的次数。
- 乘积出现
k
次,则可构成 8 × C k 2 8 \times C_k^2 8×Ck2 的同积元组。其中 C k 2 = k ( k − 1 ) 2 C_k^2=\frac {k(k-1)} 2 Ck2=2k(k−1)。 - 针对每个乘积求对应的同积元组数量即可。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)。
- 空间复杂度: O ( n ) O(n) O(n)
代码:
class Solution {
public:
int tupleSameProduct(vector<int>& nums) {
int n = nums.size();
unordered_map<int, int> hash;
for (int i = 0; i < n; i ++ )
for (int j = i + 1; j < n; j ++ )
hash[nums[i] * nums[j]] ++ ;
int res = 0;
for (auto& [p, k] : hash)
res += k * (k - 1) / 2 * 8;
return res;
}
};