JZ49 丑数(python)

题目

题目链接
若一个数只包含质因子2,3,5,且不包含其他质因子(如7),则这个数为丑数
输入n,求第n个丑数

思路

暴力

从1开始检查每一个数是否是丑数,直到已经发现n个丑数
判断一个数是否为丑数:
当这个数还是2的倍数时,不断除以2,并对因子3和5重复这一步骤
检查最后得到的结果是否是1,是1说明该数是丑数,不是1说明该数还有其他质因子,不是丑数

三指针

由于丑数一定是由另一个丑数乘2/3/5得到,因此可以维护一个丑数集dst,不断对其中的数字乘2/3/5,生成新的丑数
初始状态下,丑数集中只有一个dst[0]=1
设置i,j,k三个指针,分别指向【用来乘2/3/5生成下一个丑数的数】,初始时ijk都指向下标0

循环生成丑数,直到生成n个丑数:

  • dst[i]*2,dst[j]*3,dst[k]*5最小值,即为本次生成的新丑数,加入dst中
  • 若本次生成的丑数为dst[i]*2,则i++
  • 若为dst[j]*3,则j++
  • 若为dst[k]*5,则k++

代码

class Solution:
    def GetUglyNumber_Solution(self, index):
        if not index:
            return 0
        dst = [1]
        i, j, k = 0, 0, 0
        while len(dst) < index:
            newUgly = min(dst[i] * 2, dst[j] * 3, dst[k] * 5)
            dst.append(newUgly)
            i += 1 if newUgly == dst[i] * 2 else 0
            j += 1 if newUgly == dst[j] * 3 else 0
            k += 1 if newUgly == dst[k] * 5 else 0
        return dst[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值