📅  最后修改于: 2023-12-03 15:22:34.605000             🧑  作者: Mango
给定一个整数数组和一个整数K
,请编写一个函数来计算该数组中有多少个三元组(三个不同的数字),使它们的最大公约数为K
。
例如,对于数组[2, 3, 4, 6, 9, 12]
和K=3
,结果为3
,因为存在三个三元组(2,3,9)
、(3,6,9)
、(3,9,12)
的最大公约数均为3
。
我们可以首先统计原数组中每个数出现的次数(由于数字可以重复出现,因此必须统计频率),然后找出可行的三元组。假设当前考虑的三元组为(a,b,c)
,我们需要满足以下条件:
当然,三元组的顺序并不重要,因此我们可以假设 $a\le b\le c$,并只考虑满足 $a\le b\le c$ 的三元组。此时我们需要用到双重循环:第一重循环枚举 $a$,第二重循环枚举 $b$ 和 $c$。对于第二重循环,我们实际上只需要枚举 $b$,然后令 $c \ge b$;同时为了避免重复,我们在从数组的末尾往前遍历 $b$ 和 $c$ 时,要保证 $b<c$。
代码实现的时候,我们可以先使用 Counter 统计字符频率。然后枚举每个可能的 $(a,b,c)$,调用 math.gcd 函数计算 $\gcd$ 值。时间复杂度为$ O(n^2)$。