题目:把只包含质因子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]