leetcode 丑数
  VW0ZAOA6bLNz 2023年12月05日 29 0


给你一个整数 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 丑数_c++,即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 丑数_数据结构_03

空间复杂度:leetcode 丑数_数据结构_03


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
VW0ZAOA6bLNz