dp-剑指 Offer 49. 丑数

135 阅读1分钟

题目链接

正向

  1. 思路
    逐个判断,从1开始,逐个验证是否可以被2,3,5整除,如果商在ugly_list中,则为新的丑数
  2. 代码
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

  1. 思路
    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...}
  1. 代码
    借助三个指针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]