📌  相关文章
📜  具有GCD K的给定数组中的三元组计数(1)

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

给定数组中具有GCD K的三元组计数

给定一个长度为N的数组A和一个整数K,计算由三个元素组成的三元组(i,j,k),使得i<j<k并且Ai,Aj和Ak的最大公因数均为K。

算法
思路
  • 选取三个数依次判断是否满足条件,时间复杂度为O(N^3)。
  • 使用哈希表记录数组中各元素的出现次数,时间复杂度为O(N^2)。

因为O(N^2)时间复杂度的算法比O(N^3)更优,因此以下内容将更多地介绍哈希表解决方案。

步骤
  1. 遍历整个数组,将每个出现的元素及其出现的次数记录在哈希表中。
  2. 遍历哈希表中所有的键,因为三元组的第一个元素i必须小于第二个元素j,因此只计算大于当前键值的元素。
  3. 遍历满足条件的键的所有出现位置,计算符合要求的数量并将其相加。
代码
def count_triplets(arr, k):
    n = len(arr)
    hash_map = {}
    for i in range(n):
        if arr[i] % k == 0:
            if arr[i] in hash_map:
                hash_map[arr[i]] += 1
            else:
                hash_map[arr[i]] = 1
    count = 0
    for i in range(len(hash_map)):
        a = list(hash_map.keys())[i]
        for j in range(i, len(hash_map)):
            b = list(hash_map.keys())[j]
            c = k - a - b
            if c in hash_map and b <= c:
                if a == b == c:
                    count += hash_map[a] * (hash_map[a] - 1) * (hash_map[a] - 2) // 6
                elif a == b:
                    count += hash_map[c] * hash_map[a] * (hash_map[a] - 1) // 2
                elif a == c:
                    count += hash_map[b] * hash_map[a] * (hash_map[a] - 1) // 2
                elif b == c:
                    count += hash_map[a] * hash_map[b] * (hash_map[b] - 1) // 2
                else:
                    count += hash_map[a] * hash_map[b] * hash_map[c]
    return count
性能
  • 时间复杂度:O(N^2)
  • 空间复杂度:O(N)(哈希表的大小为N)