给你一个整数 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
设dp[i]
为第i个最大的丑数,易知第一个丑数为1,其余的丑数则是较小的丑数的2倍3倍或者5倍,设a=b=c=1,dp[i]=min(dp[a]*2,dp[b]*3,dp[c]*5)
,若dp[i]=dp[a]*2
,则a++,若dp[i]=dp[b]*3
,则b++,若dp[i]=dp[c]*5
,则c++。
最优子结构为dp[i]
第i个最大的丑数
状态转移方程为dp[i]=min(dp[a]*2,dp[b]*3,dp[c]*5)
,代表由前序列中某些数的2倍3倍或者5倍中的最小值,
因为dp[i]=min(dp[a]*2,dp[b]*3,dp[c]*5)
,所以,即dp[i]为前向序列中某些数的2倍3倍或者5倍中的最小值,且
int nthUglyNumber(int n) {
int dp[1800] = {0}, a = 1, b = 1, c = 1, t = 1;
dp[1] = 1;
while (t != n) {
dp[++t] = min(dp[a] * 2, min(dp[b] * 3, dp[c] * 5));
if (dp[a] * 2 == dp[t]) {
a++;
}
if (dp[b] * 3 == dp[t]) {
b++;
}
if (dp[c] * 5 == dp[t]) {
c++;
}
}
return dp[n];
}
时间复杂度:
空间复杂度: