📜  Array 中三元组 (a, b, c) 的计数,使得 a 除以 b 且 b 除以 c(1)

📅  最后修改于: 2023-12-03 15:13:29.435000             🧑  作者: Mango

数组中满足 a 除以 b 且 b 除以 c 的三元组计数

问题描述

给定一个非空整数数组,计算其中满足 a 除以 b 且 b 除以 c 的三元组 (a, b, c) 的个数。

示例
Input: nums = [1,2,3,4,5]
Output: 2
Explanation: 有两个满足条件的三元组:(1,2,4) 和 (1,3,5)。
解题思路

对于一个给定的三元组 (a, b, c),如果 a 除以 b 且 b 除以 c 为真,那么有以下几个性质:

  • b 必须是 a 的倍数;
  • b 必须是 c 的因数。

因此,我们可以枚举 b,然后统计能够满足条件的 a 和 c 的出现次数。

具体来说,我们可以使用两个数组 count1 和 count2 分别记录当前所有 b 的倍数和当前所有 c 的因数的出现次数。答案即为将 count1 和 count2 进行乘法统计后的累加和。

代码实现

Python 代码实现如下:

def count_good_triplets(nums: List[int], a: int, b: int, c: int) -> int:
    n = len(nums)
    count1, count2 = [0] * 1010, [0] * 1010

    for j in range(0, n):
        for k in range(j + 1, n):
            if nums[k] % b == 0:
                i = nums[k] // b
                if i <= a and j - i >= 0:
                    count1[i * 101 + j - i] += 1

            if nums[j] % b == 0:
                i = nums[j] // b
                if i <= a and k - i >= 0:
                    count2[i * 101 + k - i] += 1

    ans = 0
    for i in range(1, n):
        for j in range(i):
            if nums[i] % c == 0 and nums[j] * b == nums[i]:
                ans += count1[nums[j] * 101 + j] * count2[nums[i] // b * 101 + i]
    return ans
复杂度分析
  • 时间复杂度:$O(n^2)$,其中 n 是数组的长度。
  • 空间复杂度:$O(n^2)$,空间复杂度主要取决于存储所有 $count1$ 和 $count2$ 的元素,共有 $n^2$ 个。