剑指Offer-丑数

获取前N个丑数

如果一个数的素因子只有 2,3,5 ,我们称它为丑数,
1 是第一个丑数, 要求按大小输出前N个丑数

思路

每一个丑数都是由前面的某个丑数乘2,乘3, 或乘5得来
我们当然可以遍历前面所有丑数都分别乘 2、3、5 ,取其中的最小值来得到当前的丑数
一种很好的方法是选取前面若干丑数中最可能乘2产生当前丑数的数 a ,最可能乘 3 产生当前丑数的数 b, 和最可能乘 5 产生当前丑数的数 c ,取 2a,3b,5c 的最小值,就是当前丑数
如何选取并在遍历中更新 a, b, c :
a,b,c 为前面已经求得的丑数
每次寻找丑数时用到的 a,b,c 在以后寻找丑数的过程中不能重复使用
所以设定 p2, p3, p5 来记录 a,b,c 在数组中的位置,
每次用 p2, p3, 或 p5 来产生一个丑数时,它们就要 +1

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        if index ==0 :
            return 0
        p2 = 0
        p3 = 0
        p5 = 0
        ans = []
        ans.insert(0,1)
        for i in range(index)[1:]:
            ans.insert(i,min(ans[p2]*2,ans[p3]*3,ans[p5]*5))
            if ans[i]==ans[p2]*2:
                p2 = p2+1
            if ans[i]==ans[p3]*3:
                p3 = p3+1
            if ans[i]==ans[p5]*5:
                p5 = p5+1
        return ans[-1]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,049评论 0 13
  • 本文首发于我的个人博客:尾尾部落 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6...
    繁著阅读 301评论 0 0
  • 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包...
    zhouwaiqiang阅读 324评论 0 0
  • 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第N个丑数。 链接:...
    不胖二十斤不改名zz阅读 192评论 0 0
  • 题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子...
    qming_c阅读 233评论 0 0