📅  最后修改于: 2023-12-03 14:54:58.614000             🧑  作者: Mango
给定一个整数数组,计算其中有多少个三元组(i,j,k),满足条件:A[i] * A[j] = A[k] 并且 i < j < k。
本问题可转化为求满足上述条件的(i,j,k)的个数,其中i,j,k是满足数组索引的一组三元组。对于任意两个数A[i]和A[j],它们的乘积只能是从[0, Amax²]中的一个数,所以考虑枚举乘积A[i]*A[j]作为第三个数A[k],同时维护A[i]*A[j]出现的次数。
对于每个枚举到的数A[k],我们在求出符合要求的三元组个数之后,将A[k]出现的次数加入到乘积的出现次数中。
def countTriplets(arr):
cnt = {}
n = len(arr)
res = 0
for i in range(n):
for j in range(i + 1, n):
prod = arr[i] * arr[j]
if prod in cnt:
res += cnt[prod]
cnt[prod] = cnt.get(prod, 0) + 1
return res
时间复杂度: O(n²),其中n是数组的长度。需要枚举每两个元素之间的乘积,并且每一次枚举需要判断乘积A[i]*A[j]是否出现过,时间复杂度为O(1)。
空间复杂度: O(n),需要使用哈希表cnt维护乘积的计数器。