调和级数枚举,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
相关推荐
Giser探索家4 小时前
无人机桥梁巡检:以“空天地”智慧之力守护交通生命线
大数据·人工智能·算法·安全·架构·无人机
budingxiaomoli7 小时前
算法--滑动窗口(二)
算法
ID_180079054737 小时前
淘宝实时拍立淘按图搜索数据|商品详情|数据分析提取教程
算法·数据分析·图搜索算法
l1t7 小时前
Lua与LuaJIT的安装与使用
算法·junit·单元测试·lua·luajit
Emilia486.8 小时前
【Leetcode&nowcode】代码强化练习(二叉树)
算法·leetcode·职场和发展
墨染点香9 小时前
LeetCode 刷题【135. 分发糖果】
算法·leetcode·职场和发展
秋风战士9 小时前
通信算法之336 :3GPPMixed Mode Turbo Decoder
算法·matlab·fpga开发·信息与通信·基带工程
是那盏灯塔9 小时前
【算法】——动态规划之01背包问题
数据结构·c++·算法·动态规划
im_AMBER9 小时前
Leetcode 41
笔记·学习·算法·leetcode
jinmo_C++10 小时前
数据结构_深入理解堆(大根堆 小根堆)与优先队列:从理论到手撕实现
java·数据结构·算法