JZ49 丑数(python)

JZ49 丑数(python),第1张

题目

题目链接
若一个数只包含质因子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]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/570317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存