给你一个整数 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
解题思路:
1、一个数是丑数,那么这个数 * 2
、* 3
、* 5
仍然是丑数,可以用动态规划解题
2、初始值 dp[1] = 1
3、设立三个指针p1、p2、p3从1开始指向,分别代表dp[p1] * 2, dp[p2] * 3, dp[p3] *5选取最新小值并移动对应指针即可
代码:
class Solution {
public int nthUglyNumber(int n) {
int dp[] = new int [n + 1];
dp[1] = 1;
int p1 = 1, p2 = 1, p3 = 1;
for(int i = 2; i <= n; i ++) {
dp[i] = Math.min(dp[p1] * 2, Math.min(dp[p2] * 3, dp[p3] * 5));
if(dp[i] == dp[p1] * 2) p1 ++;
if(dp[i] == dp[p2] * 3) p2 ++;
if(dp[i] == dp[p3] * 5) p3 ++;
}
return dp[n];
}
}
注意:不能用if else语句因为6 * 2 = 4 * 3 = 12,此时就不光光只有一个指针移动了。