利用python 完成 leetcode264 丑数 II

编写一个程序,找出第 n 个丑数。

丑数就是只包含质因数 2, 3, 5 的正整数。

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:

1 是丑数。
n 不超过1690。
思路
丑数一定由前面的丑数得来(某个丑数乘2,3,5)
比如第8个丑数9(33)
前7个[1, 2, 3, 4, 5, 6, 8]
求第8个时蠢一点的方法就是把前7个数都分别乘2,3,5。然后在结果中找到大于第7个丑数的数中最小的那个。聪明一点的话就是记录下乘2,3,5的数分别在前7个能取的最大值,
求第8个丑数时,对于前7个中乘3那个的数来说乘3结果必须大于8(1,2排除)
乘出来的结果要尽可能小,所以选3
同理,乘2那个的数选5
同理,乘5那个的数选2
结果就是从(5
2,33,25)中选最小的,即3*3,因为前7个丑数中的3已经乘了一次3,在求后面的丑数时,要乘3的数只能从3以后找(不然的话就重复了)

代码

  def nthUglyNumber(self, n):
        l=[1]
        a=0
        b=0
        c=0
        
        for i in range(n-1):
            l.append(min(l[a]*2,l[b]*3,l[c]*5))
            if l[-1]==l[a]*2:a=a+1
            if l[-1]==l[b]*3:b=b+1
            if l[-1]==l[c]*5:c=c+1
                
        return l[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值