加载中...
1726-同积元组(Tuple with Same Product)
发表于:2021-12-03 | 分类: 中等
字数统计: 466 | 阅读时长: 2分钟 | 阅读量:

原文链接: 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) 的数量。其中 abcd 都是 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%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1227-飞机座位分配概率(Airplane Seat Assignment Probability)
下一篇:
1691-堆叠长方体的最大高度(Maximum Height by Stacking Cuboids )
本文目录
本文目录