原题链接:https://leetcode-cn.com/problems/ugly-number-ii/
利用动态规划的思想求第n个丑数。毫无疑问第一个丑数为1。所有的丑数必然是由以下式子构造而出:
u
g
l
y
=
2
i
×
3
j
×
5
k
ugly = 2^{i}\ \times3^{j}\ \times 5^{k}
ugly=2i ×3j ×5k
初始时,
u
g
l
y
=
2
0
×
3
0
×
5
0
=
1
ugly = 2^{0}\ \times3^{0}\ \times 5^{0} =1
ugly=20 ×30 ×50=1,时初始解。
下一个解应该是2,3 ,5,选择一个最小的数,显然是2。
对于2(1 ,0,0),它的下一个值应该是在(3,5,2*2)中选择一个最小的,是3.下面给出python程序:
class Solution(object):
def nthUglyNumber(self, n):
"""
:type n: int
:rtype: int
"""
ugly = [0]*n
ugly[0] = 1
num2 = 0
num3 = 0
num5 = 0
for i in range(1,n):
ugly[i] = min(ugly[num2]*2, ugly[num3]*3,ugly[num5]*5)
if ugly[i] / ugly[num2] == 2:
num2 += 1
if ugly[i] / ugly[num3] == 3:
num3 += 1
if ugly[i] / ugly[num5] == 5:
num5 += 1
return ugly[n-1]