https://leetcode-cn.com/problems/number-of-different-subsequences-gcds/solution/mei-ju-yin-shu-bing-pan-ding-liang-chong-fj6e/

传送门

法一

力扣上大多数题解都是法一。因为值域是2e5,又是和公约数有关,所以肯定会考虑枚举因数。这里就考虑枚举i,并判定是否存在一个子序列的gcd是i

开桶c[]记录每个数出现次数,枚举i的所有倍数j*i,则sum(c[j*i])就找到了数组里i的倍数构成的集合。对于每个合法j,求它们的gcd。若求得gcd为1,则说明该集合的gcd就是i,则i对答案有1的贡献;否则i对答案无贡献。

时间复杂度O(n*logn*logn)

法二

这位神犇的解法是法二。定义c[i]为数组中是i的倍数的数字个数。对于i的倍数j*i,j >= 2,因为j*i的倍数的集合一定是i的倍数的集合的子集,所以总是满足c[j*i] <= c[i]。对于所有c[j*i] == c[i]j,我们应只保留最大的那个j。比如[6,12,24,36]这个集合,c[6*1] == c[3*1] == c[2*1] == c[1] == 4,则只保留j = 6即可。

实现以上想法时,则枚举所有倍数,统计那些c[i]严格大于所有c[j*i]i

时间复杂度O(n*logn)。但是实测跑得比法一慢。

代码

法一
"use strict";var countDifferentSubsequenceGCDs = function(a) {let gcd = (x, y) => !y ? x : gcd(y, x % y)let mx = Math.max(...a)let c = new Array(mx + 1).fill(0)for (let v of a) c[v]++let ans = 0for (let i = 1; i <= mx; ++i) {let g = 0for (let j = 1; j * i <= mx; ++j) {if (!c[j * i]) continueg = gcd(g, j)if (g === 1) break}ans += g === 1}return ans
};
法二
"use strict";var countDifferentSubsequenceGCDs = function(a) {let gcd = (x, y) => !y ? x : gcd(y, x % y)let mx = Math.max(...a)let vis = Array(mx + 1).fill(0)let c = Array(mx + 1).fill(0)for (let v of a) vis[v]++for (let i = 1; i <= mx; ++i) {let tot = 0for (let j = 1; j * i <= mx; ++j) tot += vis[j * i]c[i] = tot}let ans = 0for (let i = 1; i <= mx; ++i) {let fl = c[i] > 0if (!fl) continuefor (let j = 2; j * i <= mx; ++j) {if (c[i] <= c[j * i]) {fl = falsebreak}}ans += fl}return ans
};

lc1819——枚举因数并判定,两种解法相关推荐

  1. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  2. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  3. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

  4. leetcode 73 矩阵置零 C++ 两种解法

    leetcode 73 两种解法~~,没有一个是我想出来的,哈哈~~ one class Solution {public:void setZeroes(vector<vector<int ...

  5. 北林oj-算法设计与分析-Line up in the canteen(两种解法,附思路)

    描述 One day, there is a kind of new delicious food from one of the windows in the canteen. All studen ...

  6. 洛谷——P1597 语句解析(两种解法)

    P1597 语句解析(两种解法) 题目背景 木有背景-- 题目描述 一串长度不超过 255 的 PASCAL 语言代码,只有 a,b,c 3 个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变 ...

  7. 整数拆分的两种解法(已完成)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 整数拆分 ...

  8. 动态规划——钢筋切割问题的两种解法解析

    动态规划问题--钢筋切割问题的两种解法解析@TOC 钢筋切割问题: 对于这个问题的两种解法 先来个官方点的解法说明: 我对两种解法的个人理解 第一种解法: 这种解法就是把先钢筋分成两部分,分别记为 i ...

  9. Leetcode 855. Exam Room 考场就座:提供两种解法

    Leetcode 855. Exam Room 考场就座: 提供两种解法 855. Exam Room 考场就座(两种解法) 题目描述 示例: 解答1 代码1 解答2 代码2 855. Exam Ro ...

最新文章

  1. 一款优秀的翻译软件DeepL
  2. 【视频课】模型剪枝+模型量化+知识蒸馏典型实践!
  3. python自定义函数画图_4.1-5 自定义函数
  4. mysql字符集调整总结
  5. java-JSON: Expected value at 1:0 错误
  6. 【Flink】Flink PipelineExecutor 体系
  7. H264/H265/YUV码流分析工具推荐(一)
  8. linux终端输出图形_Linux进程关系
  9. GIS离线地图的下载与发布
  10. 收藏 | 应急响应的基本流程
  11. 快速理解旋转运动公式
  12. greendao的简单使用
  13. 利用Python爬取小说(附源码)
  14. zabbix 5系列之snmp监控详解
  15. UML--核心元素之参与者Actor
  16. 通俗地解释下密码学中的归约证明
  17. ## GEE Landsat8 Collection2 level2 数据集 计算LST地表温度
  18. 2023北京电子科技大学计算机考研信息汇总
  19. NAG: Network for Adversary Generation 笔记
  20. 【京东】商品详情页+商品列表数据采集

热门文章

  1. 【数据中台】数据质量原因分析
  2. php 开发 web面板,phpstudy linux web面板(小皮面板)V0.2版本正式发布
  3. 最详细的Java程序打包成“可安装使用”的桌面应用
  4. 微信小程序——设置背景图片
  5. 无限法则服务器角色操作忙,无限法则海岛地图决赛圈打药及火山灰伤害测试图文介绍[多图]...
  6. 外形很犀利 Win7旗舰版全新体验
  7. iOS网络监测如何区分2、3、4G(Reachability)
  8. 英:程序员 外企 英语常用语 (整理)
  9. 旋转矩阵的应用:已知旋转前后的点坐标计算旋转中心坐标
  10. jquery实现手风琴展开效果