调和级数枚举,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
相关推荐
有为少年39 分钟前
告别“唯语料论”:用合成抽象数据为大模型开智
人工智能·深度学习·神经网络·算法·机器学习·大模型·预训练
比昨天多敲两行41 分钟前
C++ 二叉搜索树
开发语言·c++·算法
Season45041 分钟前
C++11之正则表达式使用指南--[正则表达式介绍]|[regex的常用函数等介绍]
c++·算法·正则表达式
Tisfy1 小时前
LeetCode 2839.判断通过操作能否让字符串相等 I:if-else(两两判断)
算法·leetcode·字符串·题解
问好眼1 小时前
《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
数据结构·c++·算法·二分·信息学奥赛
会编程的土豆1 小时前
【数据结构与算法】优先队列
数据结构·算法
minji...3 小时前
Linux 进程信号(二)信号的保存,sigset_t,sigprocmask,sigpending
linux·运维·服务器·网络·数据结构·c++·算法
罗湖老棍子3 小时前
最大数(信息学奥赛一本通- P1549)(洛谷-P1198)
数据结构·算法·线段树·单点修改 区间求最大值
小O的算法实验室5 小时前
2026年KBS,赏金猎人优化算法+多无人机移动边缘计算与路径规划,深度解析+性能实测
算法·无人机·边缘计算
用户5671504710215 小时前
OpenClaw 记忆管理系统技术文档
算法