把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
定义一个丑数数组,假设这个数组已经存在了n个按照顺序排序的丑数,则为了求到题目给出的第N个丑数(N>n),必须不断的按照顺序在这个数组之后继续生成丑数,生成丑数的规则如下。
由于在该数组中存在一个数T2,当在这个数之前的丑数都乘2的时候要小于数组的最大值,在这个数之后的数乘2的时候要大于数组的最大值,所以我们要不断的追踪这个T2的值,以便在每次添加丑数的时候不至于过大和过小。同理对于质因子3和质因子5也有需要追踪的T3和T5值。
每次对于数组新要添加的数,只需要添加T22,T33,T5*5的最小值即可。
python代码:
# -*- coding:utf-8 -*-
class Solution:
def GetUglyNumber_Solution(self, index):
# write code here
if index <= 0 :
return 0
ugly_list = [1]
indexOfList = 1
indexOfTwo = 0
indexOfThree = 0
indexOfFive = 0
for i in range(indexOfList,index):
ugly_list.append(min(ugly_list[indexOfTwo]*2,ugly_list[indexOfThree]*3,ugly_list[indexOfFive]*5))
while ugly_list[indexOfTwo]*2 <= ugly_list[i]:
indexOfTwo += 1
while ugly_list[indexOfThree]*3 <= ugly_list[i]:
indexOfThree += 1
while ugly_list[indexOfFive]*5 <= ugly_list[i]:
indexOfFive += 1
print(ugly_list)
return ugly_list[index-1]
if __name__ == '__main__':
solution = Solution()
solution.GetUglyNumber_Solution(3)