1.题目
给你一个由 不同 正整数组成的数组 nums
,请你返回满足 a * b = c * d
的元组 (a, b, c, d)
的数量。其中 a
、b
、c
和 d
都是 nums
中的元素,且 a != b != c != d
。
2.思路
这题如果模拟的话很显然是不能通过的,模拟是利用四层for循环来将a,b,c,d来枚举进行比较,时间复杂度为O(n^4)。
因此咱们这里需要利用一种数据结构——哈希表。咱们可以枚举数组中的两个数并计算它们的乘积,将其填入哈希表中,然后利用数学组合的知识统计。
3.代码
class Solution:
def tupleSameProduct(self, nums: List[int]) -> int:
rst ,dic = 0,{}
nums = list(set(nums))
n = len(nums)
for i in range(n):
for j in range(1+i,n):
temp = nums[i] * nums[j]
if temp in dic:
dic[temp] += 1
else:
dic[temp] = 1
for k,v in dic.items():
rst += v*(v-1)*4
return rst
首先给数组进行去重处理,然后将数组中两两相乘的结果进行统计,如果在哈希表中则次数+1,反之则添加进去。
遍历完成后对哈希表中进行下一步处理,假设 哈希表为:
dic = { 9:2 , 6:1}
这个例子里乘积为9的有2次,乘积为6的有1次,因此最终的情况为 8+0 = 8
第一个8 计算: 2 * (2-1) * 4 = 8
第二个0 计算:1 * (1-0) * 4 = 0
因此计算公式为: v * (v-1) * 4