【力扣剑指 Offer 49. 丑数、力扣264】dp+最小堆(python3)

题目描述

https://leetcode-cn.com/problems/chou-shu-lcof/

思路题解

https://leetcode-cn.com/problems/chou-shu-lcof/solution/chou-shu-by-leetcode-solution-0e5i/

dp

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[1] = 1
        p2 = p3 = p5 = 1
        for i in range(2, n + 1):
            num2, num3, num5 = dp[p2] * 2, dp[p3] * 3, dp[p5] * 5
            dp[i] = min(num2, num3, num5)
            if dp[i] == num2:
                p2 += 1
            if dp[i] == num3:
                p3 += 1
            if dp[i] == num5:
                p5 += 1
        return dp[n]

在这里插入图片描述

最小堆

class Solution:
    def nthUglyNumber(self, n: int) -> int:
        if n==0:return 0
        import heapq
        h=[]
        m={}
        heapq.heappush(h,1)
        count=1
        while count<=n:
            t=heapq.heappop(h)
            if 2*t not in m:
                heapq.heappush(h,2*t)
                m[2*t]=1
            if 3*t not in m:
                heapq.heappush(h,3*t)
                m[3*t]=1
            if 5*t not in m:
                heapq.heappush(h,5*t)
                m[5*t]=1
            count+=1
        return t

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值