一、题目
1、题目描述
给你一个由正整数组成的数组
nums
。数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。
- 例如,序列
[4,6,16]
的最大公约数是2
。数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。
- 例如,
[2,5,10]
是[1,2,1,
2,4,1,
5,
10]
的一个子序列。计算并返回
nums
的所有 非空 子序列中 不同 最大公约数的 数目 。
2、输入输出
2.1输入
1 <= nums.length <= 105
1 <= nums[i] <= 2 * 105
2.2输出
def countDifferentSubsequenceGCDs(self, nums: List[int]) -> int:
3、原题链接
二、解题报告
1、思路分析
考虑我们只关注gcd的数目
如果存在某个序列的gcd为x,那么原序列中所有x的倍数组成的序列的gcd一定是x,因为数字越多,gcd越小
那么我们枚举gcd,然后枚举其倍数,只要发现gcd成为我们枚举的数字就答案加1
要进行N(N / 1 + N / 2 + N /3 + ...) = N ln N 次
2、复杂度
时间复杂度: O(N lnN )空间复杂度:O(n)
3、代码详解
python
class Solution:
def countDifferentSubsequenceGCDs(self, nums: List[int]) -> int:
st = set(nums)
ma = max(nums)
res = len(st)
for i in range(1, ma // 3 + 1):
if i in st:
continue
g = 0
for j in range(i * 2, ma + 1, i):
if j in st:
g = gcd(g, j)
if g == i:
res += 1
break
return res