题目描述

给你一个由正整数组成的数组 nums

数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。

例如,序列 [4,6,16] 的最大公约数是 2

数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。

例如,[2,5,10][1,2,1,2,4,1,5,10] 的一个子序列。

计算并返回 nums 的所有 非空 子序列中 不同 最大公约数的 数目

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/number-of-different-subsequences-gcds

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目分析

看到 GCD(最大公约数)的题目我就头大,因为我除了质因数分解就啥都不知道了。

这题看起来不算难,但是我思考了很久还是没能独立做出来,最后还是翻阅了力扣讨论区。

我开始想的是 DP 或者排序,又试了下暴力破解(毫无疑问超时)。后面看到数据范围也不是很大,在思考枚举每个数是否能够成功答案,但是没有能够继续思考下去。。。如何判断该数字是否能够成为某些数字的 GCD 呢?

(虽然题目要求是子序列,但其实顺序并不重要,下面我就直接说子集)

假设要计算数字 x 是否能成为某个子集的 GCD ,首先要找出在数组中,能够成为 x 的倍数的数字集合(显然,不能整除 x 的数字,约数不可能有 x)。然后求出这个集合的 GCD 假设为 gcd(x倍数集合),如果 gcd(x倍数集合) 等于 x 证明这些数字的就是一个满足 GCD 为 x 的子集。

不会证明,但结论还是比较直观的 =。=

由于 \(\sum_{i=1}^n \frac{n}{i} = n*\sum_{i=1}^n \frac{1}{i} = O(n*logn)\)

求 gcd 均摊是 \(O(m*logm)\) 的, 故该算法的复杂度也为 \(O(m*logm) + O(m*logm)=O(m*logm)\)

https://leetcode-cn.com/problems/number-of-different-subsequences-gcds/solution/kao-lu-mei-yi-ge-shu-shi-fou-ke-yi-cheng-2sb2/

AC 代码

class Solution {
public:
int countDifferentSubsequenceGCDs(vector<int>& nums) {
int maxv = *max_element(nums.begin(), nums.end());
bool exist[maxv + 1];
memset(exist, false, sizeof exist);
for (int x: nums) {
exist[x] = true;
}
int count = 0;
for (int i = 1; i <= maxv; i++) {
// 枚举每一个数字是否可能成为最小公约数
int gcdv = 0;
for (int j = i; j <= maxv; j += i) {
// 只有当i的倍数(存在在数组中的)的最小公约数为i才可以
if (exist[j]) {
gcdv = gcdv ? gcd(gcdv, j) : j;
}
}
if (gcdv == i) {
count++;
}
}
return count;
}
};

总结

说实话没做出来的一部分原因是我有点畏惧 gcd (包括各种数论)的题目,但是解法就还蛮暴力的。另一个原因是我想到了这种方法但是自我否决了,主要是时间复杂度计算出错。确实这种复杂的时间复杂度计算我完全不会,还是需要加强这方面的能力。

LeetCode 1819. 序列中不同最大公约数的数目(数论)的更多相关文章

  1. LeetCode竞赛题:笨阶乘(我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。)

    通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.相反,我们设计了一个笨 ...

  2. 每日一题 - 剑指 Offer 44. 数字序列中某一位的数字

    题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 规律 难易程度:中等 题目描述: 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个 ...

  3. 剑指 Offer 44. 数字序列中某一位的数字

    题目描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位 ...

  4. 17082 两个有序数序列中找第k小

    17082 两个有序数序列中找第k小 时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: 无限制 Description 已知两个已经排好序(非减 ...

  5. 【python cookbook】【数据结构与算法】16.筛选序列中的元素

    问题:提取出序列中的值或者根据某些标准对序列做删减 解决方案:列表推导式.生成器表达式.使用内建的filter()函数 1.列表推导式方法:存在一个潜在的缺点,如果输入数据非常大可能会产生一个庞大的结 ...

  6. 【python cookbook】【数据结构与算法】12.找出序列中出现次数最多的元素

    问题:找出一个元素序列中出现次数最多的元素是什么 解决方案:collections模块中的Counter类正是为此类问题所设计的.它的一个非常方便的most_common()方法直接告诉你答案. # ...

  7. 【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变

    问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决.

  8. Openjudge计算概论-求序列中的众数

    /*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128 ...

  9. 在线性级别时间内找出无序序列中的第k个元素

    在一个无序序列中找出第k个元素,对于k很小或者很大时可以采取特殊的方法,比如用堆排序来实现 .但是对于与序列长度N成正比的k来说,就不是一件容易的事了,可能最容易想到的就是先将无序序列排序再遍历即可找 ...

  10. 计算序列中第k小的数

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046399.html 使用分治算法,首先选择随机选择轴值pivot,并使的序列中比pivot ...

随机推荐

  1. 机器学习:详解多任务学习(Multi-task learning)

    详解多任务学习 在迁移学习中,步骤是串行的,从任务\(A\)里学习只是然后迁移到任务\(B\).在多任务学习中,是同时开始学习的,试图让单个神经网络同时做几件事情,然后希望这里每个任务都能帮到其他所有 ...

  2. NVIDIA的Isaac AMR产品介绍

    NVIDIA的Isaac AMR是仓库自动运货机器人项目,说直白些就是一个AGV的小车,不过和传统的AGV不同,NVIDIA推出的这个产品是智能化的.传统AGV小车的运行代码都是写死的,直接把运行命令 ...

  3. AI机器人——人形机器人、双足机器人、四足机器人 —— 组成构建有哪些?

    参考: https://www.youtube.com/watch?v=dLELvoFt_iA

  4. 智能机器人(双足机器人、四足机器人、人形机器人humanoid)与自动驾驶技术/FSD(Full Self-Drive)“完全自动驾驶”在技术领域的相关性?

    前文: https://www.cnblogs.com/devilmaycry812839668/p/18079439 前文中已经说了,对于能力强大的机器人公司来说,软件和AI技术并不是难点,真正的难 ...

  5. ubuntu20.04/22.04 系统环境下源码编译Python3.10

    2022年10月3日更新 在Ubuntu22.04系统上源码编译python,所依赖环境的安装命令为: sudo apt install gcc g++ libffi-dev build-essent ...

  6. vue之事件监听v-on

    1.背景 2.简单使用 2.1.做一个简单的点击计数器 <!DOCTYPE html> <html lang="en" xmlns:v-on="http ...

  7. 圆方树学习笔记 & 最短路 题解

    前言 圆方树学习笔记,从一道例题讲起. 题目链接:Hydro & bzoj. 题意简述 仙人掌上求两点距离. 题目分析 为了把仙人掌的性质发挥出来,考虑将其变成一棵树.圆方树就是这样转换的工具 ...

  8. 【产品兼容认证】WhaleStudio 成功兼容TiDB数据库软件

    平凯星辰和白鲸开源宣布成功完成产品兼容认证 北京,2023年12月27日 - 平凯星辰(北京)科技有限公司(以下简称平凯星辰)旗下的 TiDB 产品与白鲸开源的 WhaleStudio 已成功完成产品 ...

  9. bazel简介(二)——从makefile向bazel转变(使用genrule)

    0x01 背景 上篇中已经介绍了bazel的基本工作原理和相关的概念.这篇将继续介绍下,现有的makefile构建工程如何切换到bazel构建系统. bazel提供了丰富的扩展方式,当然也支持从目前的 ...

  10. OBS直播抠绿插件(Matting123)

    一.产品概述 OBS直播抠绿插件(Matting123)是使用绿幕.蓝幕进行抠像的虚拟直播软件,本软件需要配合OBS30.0.0或以上版本进行使用.Matting123采用自研抠图算法,该算法已达到影 ...