C++描述 LeetCode 5243. 同积元组

C++描述 LeetCode 5243. 同积元组

  大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页

本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!
若需联系博主,可以联系本人微信:qiguanjie2015


题目

给你一个由 不同 正整数组成的数组 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) , (3,4,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 中的所有元素 互不相同

题解思路

找出所有乘积相同的乘数对,并记录数量。每N对乘数对可以形成Cn2组2对的乘数对,每2对乘积相同的乘数对可以形成8中不同的排列,所以我们只需要想找到的乘积相同的乘数对进行排列组合并且*8后进行累加即可。

算法实现

class Solution {
     
public:
    int tupleSameProduct(vector<int>& nums) {
     
        int len = nums.size(),ans = 0;
        unordered_map<int,int> hash;
        for(int  i = 0 ; i < len ; i++){
     
            for(int j = i+1 ; j < len ; j++){
     
                hash[nums[i] * nums[j]]++;
            }
        }
        for(auto &[key,value]:hash){
     
            ans += value * (value-1) / 2 * 8;
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode)