调和级数枚举,LeetCode 1819. 序列中不同最大公约数的数目

一、题目

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、原题链接

1819. 序列中不同最大公约数的数目


二、解题报告

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
相关推荐
散峰而望2 小时前
C++ 启程:从历史到实战,揭开命名空间的神秘面纱
c语言·开发语言·数据结构·c++·算法·github·visual studio
Ethan Hunt丶2 小时前
MSVTNet: 基于多尺度视觉Transformer的运动想象EEG分类模型
人工智能·深度学习·算法·transformer·脑机接口
仟濹2 小时前
【算法打卡day10(2026-02-24 周二)复习算法:DFS BFS 并查集】
算法·深度优先·图论·dfs·bfs·广度优先·宽度优先
-海绵东东-2 小时前
哈希表······················
算法·leetcode·散列表
LuDvei3 小时前
LINUX文件操作函数
java·linux·算法
XW01059993 小时前
4-11判断素数
前端·python·算法·素数
浅念-4 小时前
C++ 继承
开发语言·c++·经验分享·笔记·学习·算法·继承
算法备案代理4 小时前
深度合成算法备案:生成式AI需要备案吗?
人工智能·算法·算法备案
菜鸡儿齐4 小时前
leetcode-全排列
算法·leetcode·深度优先
Wect4 小时前
LeetCode 102. 二叉树的层序遍历:图文拆解+代码详解
前端·算法·typescript