class Solution:
def nthUglyNumber(self, n: int) -> int:
dp = [1]
for i in range(1, n):
M = dp[-1] # 当前最大丑数
tmp = []
for x in dp[::-1]: # 逆序遍历
if x * 5 < M:
break
if x * 2 > M:
tmp.append(x * 2)
if x * 3 > M:
tmp.append(x * 3)
if x * 5 > M:
tmp.append(x * 5)
dp.append(min(tmp))
return dp[-1]
思路:动态规划
暴力解中存在大量重复计算,可以考虑动态规划;
Python
class Solution:
def nthUglyNumber(self, n: int) -> int:
dp = [1] * n
p1, p2, p3 = 0, 0, 0 # 三指针归并
for i in range(1, n):
n2, n3, n5 = dp[p1] * 2, dp[p2] * 3, dp[p3] * 5
dp[i] = min(n2, n3, n5)
# 去重:使用 if 而不是 elif
if dp[i] == n2:
p1 += 1
if dp[i] == n3:
p2 += 1
if dp[i] == n5:
p3 += 1
return dp[-1]