丑数

题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

解题思路:

根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一个集合,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。

  这种思路的关键是在于怎么保证集合里面的丑数是排好序的。假设集合中已经有若干个丑数排好序后放在集合中,并且把已有最大的丑数记做M,我们接下来分析如何生成下一个丑数。该丑数肯定是前面某一个丑数乘以2、3或者5的结果,我们首先考虑把已有的丑数乘以2、3和5,然后通过比较三个数的大小,找出三个树中最小的丑数存入集合。为了避免重复,如果最小的丑数等于乘以2的结果,i2++;如果最小的丑数等于乘以3的结果,i3++;如果最小的丑数等于乘以5的结果,i5++(i2、i3和i5是集合的索引且初值为0,首先集合存入1)。这样得到的丑数在集合中是按照从小到大排序的。

 

class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        if index==None or index<=0:
            return 0
        uglynumber=[1]
        index2=0
        index3=0
        index5=0
        nextindex=1
        while nextindex<index:
            minval=min(uglynumber[index2]*2,uglynumber[index3]*3,uglynumber[index5]*5)
            uglynumber.append(minval)
            if uglynumber[index2]*2==minval:
                index2+=1
            if uglynumber[index3]*3==minval:
                index3+=1
            if uglynumber[index5]*5==minval:
                index5+=1
            nextindex+=1
        return uglynumber[-1]

 

你可能感兴趣的:(丑数)