要求:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:
野蛮求解
(1)定义一个函数来判断一个数是不是丑数,能否被2,3,5整除
(2)定义一个函数来查找丑数(每一个数都要逐步判断,时间复杂度高,很多时间都浪费在非丑数上面了)
优化方法
只考虑丑数部分,不在非丑数上花时间。第一个丑数是1,后续的丑数必然是乘以2,3或者5,然后我们给index个丑数排个序,取出最后一个丑数,就是我们要的答案。
先上一个时间效率不高的算法:
# -*- coding:utf-8 -*-
class Solution:
#先判断是不是丑数
def isUgly(self,number):
flag = 0
while number %2 == 0:
number /=2
while number %3 == 0:
number /=3
while number %5 == 0:
number /=5
if number == 1:
falg=1
return flag
#按顺序判断每一个数是不是丑数
def GetUglyNumber_Solution(self, index):
# write code here
if index < 0:
return 0
number = 0
uglyFound = 0
while uglyFound < index:
number +=1
if self.isUgly(number)== 1:
uglyFound+=1
return number
创建数组保存已经找到的丑数,用空间换时间的解法
优化算法:
# -*- coding:utf-8 -*-
class Solution:
def GetUglyNumber_Solution(self, index):
# write code here
if index <= 0:
return 0
list2 = 0
list3 = 0
list5 = 0
uglyFound = [1]
for i in range(index-1):
newUgly = min(uglyFound[list2]*2,uglyFound[list3]*3,uglyFound[list5]*5)
uglyFound.append(newUgly)
if newUgly %2 == 0:
list2+=1
if newUgly %3 == 0:
list3+=1
if newUgly %5 == 0:
list5+=1
return uglyFound[-1]