这个题解采用了一种遍历所有可能的最大公约数的方法来解决问题。首先,它找到数组中的最大值 maxVal,因为任何子序列的最大公约数不可能大于数组中的最大值。接着,创建一个布尔数组 occured 来标记哪些数字在原数组中出现过。然后,对于每一个可能的最大公约数 i(从1到maxVal),它通过遍历所有 i 的倍数来检查这些倍数是否出现在原数组中,并计算这些倍数的最大公约数。如果在某个点最大公约数降到了 i,就意味着存在一个子序列的最大公约数正好是 i。通过这种方法,可以找出所有可能的最大公约数,最后返回这些不同最大公约数的数量。
时间复杂度: O(maxVal log maxVal)
空间复杂度: O(maxVal)
class Solution:
def countDifferentSubsequenceGCDs(self, nums: List[int]) -> int:
maxVal = max(nums) # 找到数列中的最大值
occured = [False] * (maxVal + 1) # 初始化数组,记录每个数是否出现
for num in nums:
occured[num] = True # 标记出现过的数字
ans = 0
for i in range(1, maxVal + 1): # 对于每个可能的GCD i
subGcd = 0 # 初始化子序列GCD
for j in range(i, maxVal + 1, i): # 遍历i的倍数
if occured[j]: # 如果这个倍数出现过
if subGcd == 0:
subGcd = j # 初始化subGcd为j
else:
subGcd = gcd(subGcd, j) # 更新GCD
if subGcd == i: # 如果GCD降到了i
ans += 1 # 找到一个新的GCD
break
return ans # 返回不同GCD的数量