方法一:暴力拆解法,时间复杂度太高了。每个数都要算一遍了。但是这样的时间复杂度太高了基本上是不可行的
class Solution:
def GetUglyNumber_Solution(self, index):
i = 0
count = 0
while count != index:
i += 1
a = i
while i % 2 == 0:
i /= 2
while i % 3 == 0:
i /= 3
while i % 5 == 0:
i /= 5
if i == 1:
count += 1
i = a
return i
第二种方法:用空间换取时间,制造三个不同的数集, 但是时间还是超时了。继续优化吧。
class Solution:
def GetUglyNumber_Solution(self, index):
choushu = []
choushuset = []
choushu.append(1)
choushuset.append(1)
finalchoushuset = []
i = 0
while True:
finalchoushuset.append(choushuset[i])
choushu.append(choushuset[i]*2)
choushu.append(choushuset[i]*3)
choushu.append(choushuset[i]*5)
choushuset = list(set(choushu))
choushuset.sort()
i = i+1
if len(finalchoushuset) == index:
break
return (finalchoushuset[index-1])
第三种,上面其实每次还是会生成一大堆数据,而且需要对一大堆数据每次都进行排序导致时间非常慢,下面是第三种。标记法,每次生成三个数,找到最佳的,并且标记上位置。没有标记的代表还不是最小的。上面是用空间换取了脑子,但是时间还是没有提高。不过可以看到了list 和set交叉使用的好处啦
class Solution:
def GetUglyNumber_Solution(self, index):
# write code here
if index<=0:
return 0
res = [1]
t2=t3=t5=0
for i in range(1,index):
res.append(min(res[t2]*2,res[t3]*3,res[t5]*5))
if res[i] == res[t2]*2:
t2+=1
if res[i] == res[t3]*3:
t3+=1
if res[i] == res[t5]*5:
t5+=1
return res[index-1]