Leetcode 264. Ugly NumberⅡ

这道题需要将前n个ugly number计算出来,计算的过程中,维护三个指针,分别对应2、3、5乘上第几个最大的ugly number时,没有超过当前ugly number最大值。

比如当前计算出了10个ugly number [1,2,3,4,5,6,8,9,10,12]

对应的第一个指针,2 * 6 <= 12,6 = array[5],因此第一个指针point1 = 5

对应的第二个指针,3 * 4 <= 12,4 = array[4],因此第一个指针point2 = 4

对应的第三个指针,5 * 2 <= 12,2 = array[5],因此第一个指针point3 = 1

当需要增加新的ugly number时,比较2 * (point1下一个数),3 * (point2下一个数),5*(point3下一个数),并将最小的加入ugly number队列中,同时更新point1, point2, point3

class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        result = [1, 2, 3, 4, 5, 6, 8, 9, 10, 12]
        if n <= len(result):
            return result[n-1]
        
        points = [5,3,1]
        mult = [2,3,5]
        
        while n > len(result):
            choice = 0
            temp = result[points[0] + 1] * mult[0]
            for i in range(1, 3):
                while result[points[i] + 1] * mult[i] <= result[-1]:
                    points[i] += 1
                if result[points[i] + 1] * mult[i] < temp:
                    temp = result[points[i] + 1] * mult[i]
                    choice = i
            result.append(temp)
            points[choice] += 1
        
        return result[-1]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值