丑数系列
Contents
丑数
- https://leetcode-cn.com/problems/ugly-number/
- 判断一个数不是丑数难,但是判断一个数是否是丑数简单。
1 2 3 4 5 6 7
for i = 2,3,5 while(num % i == 0) num = num/i if(num == 1) return true; else return false;
丑数Ⅱ
超级丑数
- https://leetcode-cn.com/problems/super-ugly-number/
- 思路和上一题一样,只不过不再是三个指针了,有几个质数就需要几个指针!
丑数Ⅲ
- https://leetcode-cn.com/problems/ugly-number-iii/
- 这道题目中的“丑数”和前面几道题的定义都不同,定义更简单了,因为只要求能被三个数之一整除即可。
- 暴力求解法就是一个个数尝试,因为验证是否是丑数很简单的。但是这样会超出时间限制。
- 所以需要进行优化,优化的思路真的可以说是一个纯数学的思路了!
- 这道题目的关键点在于二分法,而二分法的切入点又在于确定一个整数 k 究竟是第几个丑数。
- 想知道一个数 k 是第几个丑数需要先确定 k 包含了多少个丑数因子,确定数 k 有 x 个丑数因子之后,就可以找出第 x 个丑数是多少了。
- 确定一个数有多少个丑数因子
- 该数只能被a整除 (该数一定是a 的整数倍)
- 该数只能被b整除 (该数一定是b 的整数倍)
- 该数只能被c整除 (该数一定是c 的整数倍)
- 该数只能被a和b同时整除 (该数一定是a、b最小公倍数的整数倍)
- 该数只能被a和c同时整除 (该数一定是a、c最小公倍数的整数倍)
- 该数只能被b和c同时整除 (该数一定是b、c最小公倍数的整数倍)
- 该数只能被a和b和c同时整除(该数一定是a、b、c的最小公倍数的整数倍)
- 辗转相除法也被称为除余法!(只和除数以及余数有关系)
- 根据有 n 个丑数因子的数 k, 找到第 n 个丑数 x:x=k−min(k
Author 段新朋
LastMod 2020-07-22