丑数的第n个求法-动态规划

难度中等24我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

注意的点是从1开始依次乘以2,3,5得到丑数,然后通过丑数继续得到丑数,自底向上的解法!!!
注意不能遗漏中间的丑数,所以通过列表存储丑数,并且依次移动,每次三个丑数取最小的添加,添加的该位丑数向右移动。如果两个丑数分别乘以2,3,5后都得到最小的丑数,这两个数都向右移动。

class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        动态规划,依次乘以2,3,5,取最小的,然后指针向右边移动。注意如果有某两个是一样,都要移动。
        不可遗漏,从1开始去一个一个生成。经过每一个丑数。
        """
        a = 1
        b = 1 
        c = 1
        ai = 0
        bi = 0
        ci = 0
        butter = [1]
        while len(butter) < n:
            min0 = min(a*2, b*3, c*5)
            butter.append(min0)
            if a*2 == min0:
                ai += 1
                a = butter[ai]
            if b*3 == min0:
                bi += 1
                b = butter[bi]
            if c*5 == min0:
                ci += 1
                c = butter[ci]
        return butter[-1]

你可能感兴趣的:(剑指offer)