剑指offer ----- 丑数

方法一:暴力拆解法,时间复杂度太高了。每个数都要算一遍了。但是这样的时间复杂度太高了基本上是不可行的

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值