编写一个程序,找出第 n 个丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:
1 是丑数。
n 不超过1690。
思路
丑数一定由前面的丑数得来(某个丑数乘2,3,5)
比如第8个丑数9(33)
前7个[1, 2, 3, 4, 5, 6, 8]
求第8个时蠢一点的方法就是把前7个数都分别乘2,3,5。然后在结果中找到大于第7个丑数的数中最小的那个。聪明一点的话就是记录下乘2,3,5的数分别在前7个能取的最大值,
求第8个丑数时,对于前7个中乘3那个的数来说乘3结果必须大于8(1,2排除)
乘出来的结果要尽可能小,所以选3
同理,乘2那个的数选5
同理,乘5那个的数选2
结果就是从(52,33,25)中选最小的,即3*3,因为前7个丑数中的3已经乘了一次3,在求后面的丑数时,要乘3的数只能从3以后找(不然的话就重复了)
代码
def nthUglyNumber(self, n):
l=[1]
a=0
b=0
c=0
for i in range(n-1):
l.append(min(l[a]*2,l[b]*3,l[c]*5))
if l[-1]==l[a]*2:a=a+1
if l[-1]==l[b]*3:b=b+1
if l[-1]==l[c]*5:c=c+1
return l[-1]