leetcode ugly number 2

https://leetcode.com/problems/ugly-number-ii/


understanding:


丑陋数序列可以拆分为下面3个子列表:

(1) 1×2, 2×2, 3×2, 4×2, 5×2, …
(2) 1×3, 2×3, 3×3, 4×3, 5×3, …
(3) 1×5, 2×5, 3×5, 4×5, 5×5, …

我们可以发现每一个子列表都是丑陋数本身(1, 2, 3, 4, 5, …) ,乘以 2, 3, 5。注意这里不是所有自然数,而是丑陋数本身

接下来我们使用与归并排序相似的合并方法,从3个子列表中获取丑陋数。每一步我们从中选出最小的一个,然后向后移动一步。


这里可以用3个pointers,生成完第n个最大值的时候,对应的pointer就往前走一步。那么就可以控制搜索范围。


参考:http://bookshadow.com/weblog/2015/08/19/leetcode-ugly-number-ii/

code:

class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        
        p = [1]
        k2 = k3 = k5 = 0
        while len(p) < n:
            
          
            a, b, c = [p[k2]*2, p[k3]*3, p[k5]*5]#p[k2]负责生成乘以2的新ugly number,<span style="font-family: Arial, Helvetica, sans-serif;">p[k3]负责生成乘以3的新ugly number,</span>

            m = min([a,b,c])
            if m == a:
                k2 += 1
            if m == b:
                k3 += 1
            if m == c:
                k5 += 1
            
            p.append(m)
            
            
        return p[n-1]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值