Date and Time: Feb 7, 2025, 00:41 (EST)
Link: https://leetcode.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 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)
-
1 <= nums.length <= 1000
-
1 <= nums[i] <= 10^4
-
All elements in
nums
are distinct.
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).
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:
Space Complexity: