题目链接
正向
- 思路
逐个判断,从1开始,逐个验证是否可以被2,3,5整除,如果商在ugly_list中,则为新的丑数
- 代码
class Solution:
def nthUglyNumber(self, n: int) -> int:
num = 1
ugly_list = [num]
while len(ugly_list) != n:
if num/2 in ugly_list or num/3 in ugly_list or num/5 in ugly_list:
ugly_list.append(num)
num += 1
print(ugly_list)
return ugly_list[-1]
反向-dp
- 思路
从2,3,5出发,丑数*丑数=丑数,因此三个丑数乘他们本身,得到3个丑数序列,最后做__有序合并__即可
nums2 = {1*2, 2*2, 3*2, 4*2, 5*2, 6*2, 8*2...}
nums3 = {1*3, 2*3, 3*3, 4*3, 5*3, 6*3, 8*3...}
nums5 = {1*5, 2*5, 3*5, 4*5, 5*5, 6*5, 8*5...}
- 代码
借助三个指针a,b,c,若他们乘完的得数相等,都+1
class Solution:
def nthUglyNumber(self, n: int) -> int:
dp = [1 for _ in range(n)]
a, b, c = 0, 0, 0
for i in range(n-1):
n2, n3, n5 = dp[a]*2, dp[b]*3, dp[c]*5
dp[i+1] = min(n2, n3, n5)
if n2 == dp[i+1]: a += 1
if n3 == dp[i+1]: b += 1
if n5 == dp[i+1]: c += 1
return dp[-1]