给你一个整数 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),所以leetcode 丑数_leetcode,即dp[i]为前向序列中某些数的2倍3倍或者5倍中的最小值,且leetcode 丑数_算法_02

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];
}

时间复杂度:leetcode 丑数_c++_03

空间复杂度:leetcode 丑数_c++_03