def nthUglyNumber(n: int) -> int:
if n == 0:
return None
if n == 1:
return 1
# 规定dp【i】代表第i个丑数
dp = [0 for _ in range(n+1)]
dp[1] = 1
a = b = c = 1
for i in range(2,n+1):
dp[i] = min(dp[a]*2,dp[b]*3,dp[c]*5)
if dp[i] == dp[a]*2:
a += 1
if dp[i] == dp[b]*3:
b += 1
if dp[i] == dp[c]*5:
c += 1
return dp[-1]
共以下 12 个回答
下标含义
真的难,又是能看一下午的一道题目
时间复杂度:O(N)
空间复杂度:O(N)
class Solution { dp(n);
public:
int nthUglyNumber(int n) {
vector
dp[0] = 1;
int a = 0, b = 0, c = 0;
for(int i = 1; i < n; ++i) {
dp[i] = min(dp[a]2, min(dp[b]3, dp[c]5));
if(dp[i] dp[a]2) a++;
if(dp[i] dp[b]3) b++;
if(dp[i] dp[c]5) c++;
}
return dp[n-1];
}
};
C++
思路:
定义:dp[i]是当n=i的时候的丑数
初始化:dp[0] = 1;
关系:dp[i] = min(dp[a]2, min(dp[b]3, dp[c]*5))
要注意a,b, c的转移
时间:O(n),空间:O(n)
该题时间空间复杂度为O(n)