📌  相关文章
📜  数组中三元组的计数,使得 A[i] * A[j] = A[k] 并且 i < j < k(1)

📅  最后修改于: 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]出现的次数加入到乘积的出现次数中。

思路
  1. 枚举每个A[k],同时维护乘积A[i]*A[j]的计数器。
  2. 对于每个A[k],枚举所有i<j<k的(i,j)对,计算出符合条件的三元组个数。
  3. 将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维护乘积的计数器。