leetcode - 1201. 丑数 III
请你帮忙设计一个程序,用来找出第 n 个丑数。
丑数是可以被 a 或 b 或 c 整除的 正整数。
示例 1:
输入:n = 3, a = 2, b = 3, c = 5
输出:4
解释:丑数序列为 2, 3, 4, 5, 6, 8, 9, 10… 其中第 3 个是 4。
示例 2:
输入:n = 4, a = 2, b = 3, c = 4
输出:6
解释:丑数序列为 2, 3, 4, 6, 8, 9, 12… 其中第 4 个是 6。
示例 3:
输入:n = 5, a = 2, b = 11, c = 13 输出:10 解释:丑数序列为 2, 4, 6, 8, 10, 11, 12,
13… 其中第 5 个是 10。
示例 4:
输入:n = 1000000000, a = 2, b = 217983653, c = 336916467 输出:1999999984
提示:
1 <= n, a, b, c <= 10^9
1 <= a * b * c <= 10^18
本题结果在 [1, 2 * 10^9] 的范围内
解题思路:对于给定a,b,c三个数,在[0,k]范围内,能被a整除的数字个数为k/a,能被b整除的数字个数为k/b,能被c整除的数字个数为k/c。
但是因为存在重复的情况,所以我们得把重复的值去掉。
能同时被a和b整除的数字个数为k/(a和b的最小公倍数),能同时被a和c整除的数字个数为k/(a和c的最小公倍数),能同时被b和c整除的数字个数为k/(b和c的最小公倍数)。
还有一种情况是能同时被a,b和c同时整除的数,在[0,k]范围内能同时被a,b,c整除的数字个数为k/(a和b和c的最小公倍数)。
根据上面三种情况,在[0,k]范围内的丑数个数为:k/a+k/b+k/c−k/(a,b最小公倍数)−k/(a,c最小公倍数)−k/(b,c最小公倍数)+k/(a,b,c最小公倍数)k/a + k/b + k/c - k/(a,b最小公倍数) - k/(a,c最小公倍数) - k/(b,c最小公倍数) + k/(a,b,c最小公倍数)k/a+k/b+k/c−k/(a,b最小公倍数)−k/(a,c最小公倍数)−k/(b,c最小公倍数)+k/(a,b,c最小公倍数)
两个数的最小公倍数可以通过以下公式进行计算:两个数的最小公倍数=两个数的乘积/两个数的最大公因数两个数的最小公倍数=两个数的乘积/两个数的最大公因数两个数的最小公倍数=两个数的乘积/两个数的最大公因数具体求解最小公倍数方法和证明可以看一下这个证明博客。
最大公因数可以通过辗转相除法得到,具体证明过程可以看一下这篇博客。
其C++代码如下:
class Solution {public:int nthUglyNumber(int n, int a, int b, int c) {int a_b = max_common_factor(a,b); // 获得a和b的最大公因数 int a_c = max_common_factor(a,c); // 获得a和c的最大公因数 int b_c = max_common_factor(b,c); // 获得b和c的最大公因数 long max_a_b = (long)a*b/a_b; // 获得a和b的最小公倍数 long max_a_c = (long)a*c/a_c; // 获得a和c的最小公倍数long max_b_c = (long)b*c/b_c; // 获得b和c的最小公倍数long max_a_b_c = (long)a*max_b_c/max_common_factor((long)a,max_b_c); // 获得a,b,c的最小公倍数int l=min(a,min(b,c)); // 获得a,b,c中的最小值int r = INT_MAX; // 二分查找中的最大值while(l<r){int mid = l + (r-l)/2; // 取中位数int num_a = mid/a; int num_b = mid/b;int num_c = mid/c;int num_a_b = mid/max_a_b;int num_a_c = mid/max_a_c;int num_b_c = mid/max_b_c;int num_a_b_c = mid/max_a_b_c;if((num_a + num_b + num_c - num_a_b - num_a_c - num_b_c + num_a_b_c)>=n)r = mid;elsel = mid+1;}return l; }int max_common_factor(int a,int b) // 取两个数的最大公因数{while(b!=0){int temp = a%b;a = b;b = temp;}return a;}
};
leetcode - 1201. 丑数 III相关推荐
- LeetCode 1201. 丑数 III(最小公倍数+二分查找)
1. 题目 请你帮忙设计一个程序,用来找出第 n 个丑数. 丑数是可以被 a 或 b 或 c 整除的 正整数. 示例 1: 输入:n = 3, a = 2, b = 3, c = 5 输出:4 解释: ...
- LeetCode 263. 丑数 264. 丑数 II(DP)
文章目录 1. LeetCode 263. 丑数 解题 2. LeetCode 264. 丑数 II DP解题 1. LeetCode 263. 丑数 编写一个程序判断给定的数是否为丑数. 丑数就是只 ...
- leetcode - 264. 丑数 II
264. 丑数 II -------------------------------------------- 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示 ...
- LeetCode 264. 丑数 II--动态规划
丑数 II 编写一个程序,找出第 n 个丑数. 丑数就是质因数只包含 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 1 ...
- Leetcode 264. 丑数 II 解题思路及C++实现
方法一:暴力解法 解题思路: 直接从整数1开始,不断递增,判断该数字是否为丑数(专门写一个判断是否为丑数的函数),当遇到一个丑数,则计数值加1,直至遇到n个丑数为止. 当n很大时,这种暴力解法会遇到 ...
- 86. Leetcode 264. 丑数 II (动态规划-基础题)
给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 5 的正整数.示例 1:输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, ...
- 78. Leetcode 264. 丑数 II (堆-技巧二-多路归并)
给你一个整数 n ,请你找出并返回第 n 个 丑数 .丑数 就是只包含质因数 2.3 和/或 5 的正整数.示例 1:输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, ...
- LeetCode 264. 丑数 II
264. 丑数 II Ideas 竟然没想到用小根堆,白学了,再把小根堆抄一遍. Code Python class Solution:def nthUglyNumber(self, n: int) ...
- leetcode 263. 丑数(Java版)
题目 https://leetcode-cn.com/problems/ugly-number/ 题解 思路比较简单,如下: 如果当前数可以被 2.3.5 当中任意一个整除,就一直除,直到不能被 2. ...
最新文章
- C#如何判断线程池中所有的线程是否已经完成(转)
- 区块链应用 | 用区块链颠覆视频直播,与视频卡顿、缓冲说再见!
- uva 544(kruskal 变形)
- SQL 必知必会·笔记9使用子查询
- 产品问答 | 领导把锅甩给你,你会怎么做?
- TCP建立连接与断开连接的过程
- (个人使用)uni-app开发(官方资源)· 汇总
- go redis 清空所有值_【大厂面试】面试官看了赞不绝口的Redis笔记二
- 一建管道工程122知识点_背诵的知识点是否边缘化?一建市政一本通+学霸笔记,教你只记重点...
- vue中给window添加滚动监听无效的解决方案
- Android知识体系框架
- Win10下Tensorflow(GPU版)安装趟坑实录,成功了。
- 模拟退火法-TSP问题
- UVa 1149 Bin Packing 【贪心】
- 计算机网络——计算机网络病毒和黑客
- nginx系列第一篇:nginx源码下载,编译和安装
- 离散数学 | 数理逻辑
- Electron-Builder打包时报错could not find: “\XXX\0-messages.nsh“
- CPU微指令相关概念
- class ts 扩展方法_ts各种类型和用法