文章目录
- 1. LeetCode 263. 丑数
- 解题
- 2. LeetCode 264. 丑数 II
- DP解题
1. LeetCode 263. 丑数
编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例 1:
输入: 6
输出: true
解释: 6 = 2 × 3示例 2:
输入: 8
输出: true
解释: 8 = 2 × 2 × 2示例 3:
输入: 14
输出: false
解释: 14 不是丑数,因为它包含了另外一个质因数 7。
说明:
1 是丑数。
输入不会超过 32 位有符号整数的范围: [−2^31, 2^31 − 1]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ugly-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
- 类似题目:
LeetCode 1201. 丑数 III(最小公倍数+二分查找)
程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)
LeetCode 313. 超级丑数(动态规划)
LeetCode 878. 第 N 个神奇数字(二分查找)
class Solution {
public:bool isUgly(int num) {if(num < 0)return false;int n;while(num != 1){n = num;//记录原数if(num%2 == 0)num /= 2;if(num%3 == 0)num /= 3;if(num%5 == 0)num /= 5;if(n == num) //操作下来,数没变return false;}return true;}
};
2. LeetCode 264. 丑数 II
编写一个程序,找出第 n 个丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ugly-number-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
DP解题
- 类似题目:程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)
- 参考别人的解法
- 每次将前面的所有数乘以 k ( 2,3,5 ),取比前一个丑数 Ui-1 大,且最小的
- 但是不必遍历前面所有数,因为 前面有一个丑数 Ux* k <= Ui-1 ,x++,那么前面式子不成立的时候,下标 x 就是下次 乘以 k 的丑数位置
class Solution {
public:int nthUglyNumber(int n) {int dp[n+1] = {0};dp[1] = 1;int i2=1, i3=1, i5=1;for(int i = 2; i <= n; i++){dp[i] = min(dp[i2]*2, min(dp[i3]*3, dp[i5]*5));if(dp[i2]*2 == dp[i])i2++;if(dp[i3]*3 == dp[i])i3++;if(dp[i5]*5 == dp[i])i5++;}return dp[n];}
};
- 优先队列
class Solution {
public:int nthUglyNumber(int n) {set<long> s;s.insert(1);int count = 0;long tp;while(count != n){count++;tp = *s.begin();s.erase(s.begin());s.insert(tp*2);s.insert(tp*3);s.insert(tp*5);}return tp;}
};