丑数
问题简述
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。
求按从小到大的顺序的第 n 个丑数。思路:暴力解
根据丑数的定义,有如下推论:
一个丑数乘以 2、3、5 之后,还是丑数;
从 1 开始,对每个丑数都乘以 2、3、5,再加入丑数序列(移除重复),那么不会产生遗漏;
对已有的丑数乘以 2、3、5,取其中大于已知最大丑数的最小值;
思路:动态规划
暴力解中存在大量重复计算,可以考虑动态规划;
Last updated
问题简述
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。
求按从小到大的顺序的第 n 个丑数。思路:暴力解
根据丑数的定义,有如下推论:
一个丑数乘以 2、3、5 之后,还是丑数;
从 1 开始,对每个丑数都乘以 2、3、5,再加入丑数序列(移除重复),那么不会产生遗漏;
对已有的丑数乘以 2、3、5,取其中大于已知最大丑数的最小值;
思路:动态规划
暴力解中存在大量重复计算,可以考虑动态规划;
Last updated
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]