一、题目描述
给你一个整数 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 通常被视为丑数。
二、解题
动态规划
dp[i] 表示第 i 个丑数,第 n 个丑数即为dp[n]。
最小的丑数是 1,因此 dp[1]=1;
定义三个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都是 1。
- dp[i] = min(dp[p2]*2,dp[p3]*3,dp[p5]*5)
- 其次比较dp[i] 和 dp[p2]*2、dp[p3]*3、 dp[p5]*5是否相等,相等则将对应的指针+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];
}
}
时间复杂度:O(n);
空间复杂度:O(n)。
263. 丑数
一、题目描述
丑数 就是只包含质因数 2、3 和 5 的正整数。
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例 2:
输入:n = 1
输出:true
解释:1 没有质因数,因此它的全部质因数是 {2, 3, 5} 的空集。习惯上将其视作第一个丑数。
示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
二、解题
数学
class Solution {
public boolean isUgly(int n) {
if(n <= 0){
return false;
}
int[] factors = new int[]{2,3,5};
for(int factor : factors){
while(n % factor == 0){
n /= factor;
}
}
return n==1;
}
}
时间复杂度:O(logn);
空间复杂度:O(1)。