调和级数枚举,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
相关推荐
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
独自破碎E1 小时前
【二分法】寻找峰值
算法
mit6.8242 小时前
位运算|拆分贪心
算法
ghie90902 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体12 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk9982 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
Z1Jxxx3 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++3 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
vyuvyucd3 小时前
C++引用:高效编程的别名利器
算法
鱼跃鹰飞4 小时前
Leetcode1891:割绳子
数据结构·算法