题目描述:
我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
class Solution(object):
def nthUglyNumber(self, n):
"""
:type n: int
:rtype: int
"""
# 由于丑数是质因数只有2,3,5的数(1除外)。 因此丑数可以定义为 2 ^ x * 3 ^ y * 5 ^ z。
# 我们定义三种状态:
# 最后一个乘的质因数是2
# 最后一个乘的质因数是3
# 最后一个乘的质因数是5
# 为了简单起见,我们定义三个指针,分别指向上一个乘的质因数是2, 乘的质因数是3, 乘的质因数是5的位置。
p1=p2=p3=0
states=[1]*n
for i in range(1,n):
states[i]=ith=min(states[p1]*2,states[p2]*3,states[p3]*5)
if ith == states[p1]*2: p1 +=1
if ith == states[p2]*3: p2 +=1
if ith == states[p3]*5: p3 +=1
return states[-1]