题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
# -*- coding:utf-8 -*-
class Solution:
def GetUglyNumber_Solution(self, index):
# write code here
if index==0:
return 0
index2=0
index3=0
index5=0
ugly=[1]
for i in range(index-1):
newugly=min([2*ugly[index2],3*ugly[index3],5*ugly[index5]])
ugly.append(newugly)
if newugly%2==0:
index2+=1
if newugly%3==0:
index3+=1
if newugly%5==0:
index5+=1
return ugly[-1]
由题可知,丑数的因子只有2,3,5,说明丑数是由2,3,5的幂次乘积得来的,例如8=2*2*2。第一个丑数是1,那么后面由1得来的丑数就是1*2=2,1*3=3,1*5=5,2又产生了三个丑数:2*2=4,2*3=6,2*5=10。也就是说,每生成一个丑数,它在后面也会相应的产生三个丑数。
上面的规律找到了,但是我们想让丑数从小到大一点点递增上去,实际上:
那么我们让它一点点的去乘2,乘3,乘5,去看看哪个数小,就达到了让丑数一点一点增加的效果,为此使用了三个index来计数ugly中的x,y,z分别是多少,之后再分别乘2,乘3,乘5,也就是x+1,y+1,z+1,这样就比价好理解了。