文章目录

  • 一、题目
    • 1、题目描述
    • 2、基础框架
    • 3、原题链接
  • 二、解题报告
    • 1、思路分析
    • 2、时间复杂度
    • 3、代码详解
  • 三、本题小知识
  • 四、加群须知

一、题目

1、题目描述

  给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。丑数是可以被 a 或 b 或 c 整除的 正整数 。
  样例输入: n = 5, a = 2, b = 11, c = 13
  样例输出: 10

2、基础框架

  • C语言 版本给出的基础框架代码如下:
int nthUglyNumber(int n, int a, int b, int c){}

3、原题链接

LeetCode 1201. 丑数 III

二、解题报告

1、思路分析

  XXX 个数 中能被 aaa 和 bbb 同时整除的个数记为 ababab,能被 bbb 和 ccc 同时整除的记为 bcbcbc,能被 aaa 和 ccc 同时整除的记为 acacac,能被 aaa bbb ccc 同时整除的个数,记为 abcabcabc。根据容斥原理,a+b+c−ab−ac−bc+abca+b+c - ab - ac - bc + abca+b+c−ab−ac−bc+abc 就是能被任意一个数整除的个数。
  而这里的 ababab 如何计算呢?ababab 的值,就等于 Xgcd(a,b)\frac {X} {gcd(a,b)}gcd(a,b)X​。XXX 越大,肯定满足条件的丑数越多,这是一个直观感受(当然也可以很容易的证明)。所以我们可以二分枚举 XXX,然后再用上述公式判断可行,满足 a+b+c−ab−ac−bc+abc≥na+b+c - ab - ac - bc + abc \ge na+b+c−ab−ac−bc+abc≥n 条件的最小的 XXX 就是答案了,所有满足这个条件的数定义为绿色,然后二分找绿色的左边界即可。

2、时间复杂度

   时间复杂度为 O(log2n)O(log_2n)O(log2​n)。

3、代码详解

/************** 二分查找 数组 模板 **************/
/*1)传参的数组满足:红红红红红红红红绿绿绿绿绿绿绿; 2)返回值:绿色区段的左边界;
*/int isGreen(long long val, int x);int binarySearch(int l, int r, int x) {int mid;while(l + 1 < r) {mid = l + (r - l) / 2;if( isGreen(mid, x) )r = mid;elsel = mid;}return r;
}
/************** 二分查找 数组 模板 **************/
#define ll long long
int A, B, C;int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);     // (1)
}
ll lcm(int a, int b) {return (ll)a / gcd(a, b) * b;          // (2)
}int isGreen(ll val, int x) {               // (3)ll ans = val / A + val / B + val / C - val / lcm(A, B) - val / lcm(B, C) - val / lcm(A, C) + val / lcm(lcm(A, B), C);return ans >= x;
}int nthUglyNumber(int n, int a, int b, int c){A = a;B = b;C = c;return binarySearch(0, 2000000001, n); // (4)
}
  • (1)(1)(1) 计算 aaa 和 bbb 的最大公约数;
  • (2)(2)(2) 计算 aaa 和 bbb 的最小公倍数;
  • (3)(3)(3) 利用容斥原理判断二分可行性;
  • (4)(4)(4) 二分枚举找表达式满足的左边界就是答案;

三、本题小知识

   二分枚举一般也被用来枚举一个定义域上的可行解,只要这个解满足单调性。


四、加群须知

  相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」
  那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:

⭐算法入门⭐《二分枚举》中等05 —— LeetCode 1201. 丑数 III相关推荐

  1. LeetCode 1201. 丑数 III(最小公倍数+二分查找)

    1. 题目 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释: ...

  2. leetcode - 1201. 丑数 III

    请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释:丑数序列为 ...

  3. LeetCode 263. 丑数 264. 丑数 II(DP)

    文章目录 1. LeetCode 263. 丑数 解题 2. LeetCode 264. 丑数 II DP解题 1. LeetCode 263. 丑数 编写一个程序判断给定的数是否为丑数. 丑数就是只 ...

  4. LeetCode 264. 丑数 II--动态规划

    丑数 II 编写一个程序,找出第 n 个丑数. 丑数就是质因数只包含 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 1 ...

  5. LeetCode 248. 中心对称数 III(DFS/BFS)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 写一个函数来计算范围在 [low ...

  6. leetcode - 264. 丑数 II

    264. 丑数 II -------------------------------------------- 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示 ...

  7. 三个数互质 java_LeetCode 5198. 丑数 III(Java)容斥原理和二分查找

    请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释:丑数序列为 ...

  8. ⭐算法入门⭐《哈希表》中等05 —— LeetCode 215. 数组中的第K个最大元素

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给定整数数组nums和 ...

  9. Leetcode 264. 丑数 II 解题思路及C++实现

    方法一:暴力解法 解题思路: 直接从整数1开始,不断递增,判断该数字是否为丑数(专门写一个判断是否为丑数的函数),当遇到一个丑数,则计数值加1,直至遇到n个丑数为止. 当n很大时,这种暴力解法会遇到 ...

  10. 86. Leetcode 264. 丑数 II (动态规划-基础题)

    给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 5 的正整数.示例 1:输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, ...

最新文章

  1. python实现双向最大匹配法
  2. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
  3. pytorch——torch.backends.cudnn.benchmark = True
  4. OpenLayers 官网例子的中文详解
  5. linux 时间 无法连接服务器地址,怎么解决linux访问不了ip地址问题?
  6. mysql中什么叫临时表_MySQL中使用临时表需要注意哪些?
  7. 用 Shell 快速写一个嵌入式测试框架
  8. C#如何[添加][删除][修改]XML中的记录
  9. PostreSQL崩溃试验全记录
  10. java北大oj1001_这个——北大 ACM POJ 1001 Exponentiation C/C++
  11. android listView与adapter
  12. 大学生 计算机 毕业设计 xx管理系统 毕设(1)
  13. 机械革命Z3 Pro测试,从开箱到翻车到上岸到发烧(多图预警)
  14. 图像isp 详解_【转】 ISP概述、工作原理及架构
  15. crm系统服务器要求,crm系统需要配备什么云服务器
  16. matlab 跳步,给定两个大整数u和v,它们分别有m和n位数字,且m≤n.用通常的乘法求uv的值需要O(mn)时间.可以将u和v.. - 上学吧找答案(手机版)...
  17. 【JIRA 学习】JIRA 配置缺陷的reopen 次数
  18. Testing Types - 读书笔记
  19. linux 常用解压、压缩命令合集——筑梦之路
  20. java通过ip地址获取相应对应的城市

热门文章

  1. DSO windowed optimization 代码 (4)
  2. mysql 只读_MySQL设置只读模式
  3. 修改PPT导出图片DPI值
  4. 基于GoLang的MMO游戏服务器(四)
  5. SCARA、通用6轴机器人奇异点位置与问题分析
  6. 交换机路由器常用命令大全
  7. Everything+Wox
  8. MATLAB Appdesigner开发独立桌面App全流程(三):App的简单美化、打包、安装及卸载
  9. 耶利哥打不开因计算机丢失,我的电脑游戏打不开说什么应用程序错误。是不是中毒了...
  10. html5接金币游戏源码,利用HTML5实现Canvas聚宝盆接金币游戏