leetcode 丑数

给你一个整数 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),所以 ( d p [ a ] ∗ 2 , d p [ b ] ∗ 3 , d p [ c ] ∗ 5 ) ≥ d p [ i ] (dp[a]*2,dp[b]*3,dp[c]*5)\geq dp[i] (dp[a]2,dp[b]3,dp[c]5)dp[i],即dp[i]为前向序列中某些数的2倍3倍或者5倍中的最小值,且 d p [ i ] > ∀ j < i   d p [ j ] dp[i]> \forall jdp[i]>j<i dp[j]

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

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

你可能感兴趣的:(算法,leetcode,算法,数据结构)