Skip to content

Latest commit

 

History

History
76 lines (59 loc) · 3.46 KB

1726.Tuple_with_Same_Product(Medium).md

File metadata and controls

76 lines (59 loc) · 3.46 KB

1726. Tuple with Same Product (Medium)

Date and Time: Feb 7, 2025, 00:41 (EST)

Link: https://leetcode.com/problems/tuple-with-same-product


Question:

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 valid 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)


Constraints:

  • 1 <= nums.length <= 1000

  • 1 <= nums[i] <= 10^4

  • All elements in nums are distinct.


Walk-through:

We can brute force loop over nums to form all permutation of two integers, so we can use their mulitplication as key and save two pairs of these two integers ([i, j], [j, i]). Then, we check for every key of dict{}, if len(lst) >= 2, we need at least two pairs to form a tuple, so we can update res with the number of permutation by len(lst) * (len(lst) - 2) (because we save [i, j], [j, i] but we can't form (i,j,j,i), so each list can be a permutation with the rest lists, which is also the reason we want to check we have at least two lists).


Python Solution:

class Solution:
    def tupleSameProduct(self, nums: List[int]) -> int:
        # Use two integers' multiplication as key, save two pairs[i, j], [j, i]
        
        # TC: O(n^2), n=len(nums), SC: O(n^2)
        dictionary = collections.defaultdict(list)
        res = 0
        # Save pairs into dict
        for i in range(len(nums)-1):
            for j in range(i+1, len(nums)):
                val = nums[i] * nums[j]
                # Save two pairs into dict
                dictionary[val].append([nums[i], nums[j]])
                dictionary[val].append([nums[j], nums[i]])
        # Count the frequency for each val
        for key, lst in dictionary.items():
            if len(lst) >= 2:
                res += len(lst) * (len(lst) - 2)
        return res

Time Complexity: $O(n^2)$
Space Complexity: $O(n^2)$


CC BY-NC-SABY: credit must be given to the creatorNC: Only noncommercial uses of the work are permittedSA: Adaptations must be shared under the same terms