剑指 Offer 49. 丑数

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

方法:动态规划  时间复杂度O(n)  空间复杂度O(n)  

根据丑数的性质,目标丑数 = 某个小丑数 * 2/3/5

采用动态规划,对于丑数数组,每个数都需要乘2/3/5,故设定三个指针,分别代表每个丑数乘以2、3、5,当当前丑数等于另一个丑数乘以2/3/5后,指针+1

def nthUglyNumber(n):
        """
        :type n: int
        :rtype: int
        """
        dp,a,b,c = [1]*n,0,0,0
        for i in range(1,n):
            n2,n3,n5 = dp[a] * 2, dp[b] * 3, dp[c] * 5
            dp[i] = min(n2,n3,n5)
            if dp[i] == n2:
                a += 1
            if dp[i] == n3:
                b += 1
            if dp[i] == n5:
                c += 1
        return dp[-1]

 

posted @ 2022-08-01 21:57  Liang-ml  阅读(31)  评论(0)    收藏  举报