题目:原题链接(中等)
标签:数学、动态规划
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
---|---|---|---|
Ans 1 (Python) | O ( M l o g M ) O(MlogM) O(MlogM) : M为丑数的个数 | O ( 1 ) O(1) O(1) | 超出时间限制 |
Ans 2 (Python) | O ( N ) O(N) O(N) | O ( N ) O(N) O(N) | 148ms (94.04%) |
Ans 3 (Python) |
解法一(最暴力的暴力解法):
class Solution:
def nthUglyNumber(self, n: int) -> int:
num = 1
cnt = 0
while cnt < n:
tmp = num
while tmp % 2 == 0:
tmp /= 2
while tmp % 3 == 0:
tmp /= 3
while tmp % 5 == 0:
tmp /= 5
if tmp == 1:
cnt += 1
if cnt == n:
return num
num += 1
解法二(动态规划):
class Solution:
def nthUglyNumber(self, n: int) -> int:
dp = [1] * n
i1, i2, i3 = 0, 0, 0
for i in range(1, n):
n1, n2, n3 = dp[i1] * 2, dp[i2] * 3, dp[i3] * 5
dp[i] = min(n1, n2, n3)
if n1 == dp[i]:
i1 += 1
if n2 == dp[i]:
i2 += 1
if n3 == dp[i]:
i3 += 1
return dp[-1]