原文链接: https://leetcode-cn.com/problems/tuple-with-same-product
英文原文
Given an array nums
of distinct positive integers, return the number of tuples (a, b, c, d)
such that a * b = c * d
where a
, b
, c
, and d
are elements of nums
, and a != b != c != d
.
Example 1:
Input: nums = [2,3,4,6] Output: 8 Explanation: There are 8 valid tuples: (2,6,3,4) , (2,6,4,3) , (6,2,3,4) , (6,2,4,3) (3,4,2,6) , (4,3,2,6) , (3,4,6,2) , (4,3,6,2)
Example 2:
Input: nums = [1,2,4,5,10] Output: 16 Explanation: There are 16 valids tuples: (1,10,2,5) , (1,10,5,2) , (10,1,2,5) , (10,1,5,2) (2,5,1,10) , (2,5,10,1) , (5,2,1,10) , (5,2,10,1) (2,10,4,5) , (2,10,5,4) , (10,2,4,5) , (10,2,5,4) (4,5,2,10) , (4,5,10,2) , (5,4,2,10) , (5,4,10,2)
Example 3:
Input: nums = [2,3,4,6,8,12] Output: 40
Example 4:
Input: nums = [2,3,5,7] Output: 0
Constraints:
1 <= nums.length <= 1000
1 <= nums[i] <= 104
- All elements in
nums
are distinct.
中文题目
给你一个由 不同 正整数组成的数组 nums
,请你返回满足 a * b = c * d
的元组 (a, b, c, d)
的数量。其中 a
、b
、c
和 d
都是 nums
中的元素,且 a != b != c != d
。
示例 1:
输入:nums = [2,3,4,6] 输出:8 解释:存在 8 个满足题意的元组: (2,6,3,4) , (2,6,4,3) , (6,2,3,4) , (6,2,4,3) (3,4,2,6) , (4,3,2,6) , (3,4,6,2) , (4,3,6,2)
示例 2:
输入:nums = [1,2,4,5,10] 输出:16 解释:存在 16 个满足题意的元组: (1,10,2,5) , (1,10,5,2) , (10,1,2,5) , (10,1,5,2) (2,5,1,10) , (2,5,10,1) , (5,2,1,10) , (5,2,10,1) (2,10,4,5) , (2,10,5,4) , (10,2,4,5) , (10,2,4,5) (4,5,2,10) , (4,5,10,2) , (5,4,2,10) , (5,4,10,2)
示例 3:
输入:nums = [2,3,4,6,8,12] 输出:40
示例 4:
输入:nums = [2,3,5,7] 输出:0
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 104
nums
中的所有元素 互不相同
通过代码
高赞题解
题目2:5243. 同积元组
思路:哈希 + 数学
头疼的TLE:先固定两个位置,双指针遍历剩余位置,时间复杂度 $O(n^3)$,不可取
哈希表记录乘积
从示例 $1$ 可以看出,我们只要找到一个 $(a, b, c, d)$ 标准四元组(这里的“标准”指 $a < b < c < d$),即可将其改变顺序,拓展出 $8$ 个满足题意的四元组。而如果我们将其变为 $[1, 2, 3, 4, 6, 12]$,则可以找到 $[1, 2, 6, 12]$,$[1,3,4,12]$ 以及 $[2, 3, 4, 6]$ 三个标准四元组,可以发现,这三个标准四元组实际即为三个二元组 $[1, 12]$,$[2, 6]$ 以及 $[3, 4]$ 的两两组合,而这三个二元组满足的条件是乘积为 $12$。所以,我们进一步简化问题,只要利用哈希表记录每个不同乘积对应的二元组数目,并将其两两组合,即可得到不同的标准四元组。
计算过程
假设一个乘积 $x$ 出现的次数为 $y$,则其对应的二元组数目有 $y$ 个。这些二元组两两组合,形成的标准四元组个数为 $C_y^2$ 。根据前面的分析,一个标准四元组可以通过改变顺序,拓展为 $8$ 个满足题意的解,故可得到的解为 $8C_y^2$。我们遍历整个哈希表,将所有乘积 $x$ 对应的解个数相加即可。
代码:
class Solution {
public:
int tupleSameProduct(vector<int>& nums) {
int n = nums.size();
unordered_map<int, int> mp;
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
mp[nums[i] * nums[j]]++;
}
}
int ret = 0;
// 遍历哈希表
for(auto c : mp) {
ret += c.second * (c.second - 1) / 2;
}
return ret * 8;
}
};
复杂度分析:
- 时间复杂度为 $O(n^2)$。
- 空间复杂度为 $O(n^2)$,预处理了两两乘积。
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
5766 | 11868 | 48.6% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|