剑指offer刷题笔记-49丑数

在这里插入图片描述
第一眼知道是dp问题,但是理不清思路,发现dp问题的核心和难点在于抽象出最终最优解与子最优解之间的关系函数。此题中,需要用opt[n-1]…opt[1]来求opt[n], 但是1~n-1每个数都有*2,*3,5 三种可能作为opt[n]的可能解,过于复杂。看了解题思路很受启发,只需要从第一个数1开始,用三个index控制2, *3, *5的数的位置。下一个丑数就是这三个index对应的值的最小那个,然后把对应的index向右移动一位,循环此策略:

class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        ind_2, ind_3, ind_5 = 0, 0, 0
        ugly = n*[1]
        for i in range(1,n):
            ugly[i] = min(ugly[ind_2]*2, ugly[ind_3]*3, ugly[ind_5]*5)
            if ugly[i] == ugly[ind_2]*2: ind_2+=1
            if ugly[i] == ugly[ind_3]*3: ind_3+=1
            if ugly[i] == ugly[ind_5]*5: ind_5+=1
        return ugly[n-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值