丑数
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
丑数 就是只包含质因数 2,3 , 5 的正整数。
示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例 2:
输入:n = 8
输出:true
解释:8 = 2 × 2 × 2
示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
示例 4:
输入:n = 1
输出:true
解释:1 通常被视为丑数。
提示:
思路:
题目说1 是第一个丑数,那说明0和负数都不是丑数,对于其他数只要和2,3,5,做除数运算即可,丑数的因数都是丑数
然后我当时写的时候QAQ看错题目了,淦!我以为是判断一个数的因数都是质数这样的数…比如2x3x5x7x11这样的
所以我一开始的代码就是判断N是不是只有质数,所有的结果都是true,我真是个傻子555…
public static boolean isUgly(int n) {
if(n<=0) return false;
if(n==1||n==2||n==3||n==5) return true; //如果是1,2,3,5直接返回
int j=2;
boolean flag=false;
while(j<=5) {
if(j==4) {j++ ; continue;}//注意要j++,要不然就卡死在这了
if(n%j==0) {
int temp=n/j;
flag=isUgly(temp);//如果temp是丑数那么n一定是丑数,否则n也不是
return flag;
}
j++;
}
return flag;
}
丑数2
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。
提示:
1 <= n <= 1690
思路:
第几个丑数实际上就是2,3,5这三个数互相乘积的升排序,例如: 1x2 , 1x3, 2x2 , 1x5 , 2x3 , 2x2x2 , 3x3 , 2x5
利用 动态规划 三指针,定义三个指针 p2, p3 ,p5 初始值都为1。
class Solution {
public int nthUglyNumber(int n) {
int[] dp = new int[n + 1];
dp[1] = 1;
int p2 = 1, p3 = 1, p5 = 1;
for (int i = 2; i <= n; i++) {
int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
dp[i] = Math.min(Math.min(num2, num3), num5);
if (dp[i] == num2) {
p2++;
}
if (dp[i] == num3) {
p3++;
}
if (dp[i] == num5) {
p5++;
}
}
return dp[n];
}
}