剑指Offer31:丑数

思路:

通俗易懂的解释:

首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那么我们从1开始乘以2,3,5,就得到2,3,5三个丑数,在从这三个丑数出发乘以2,3,5就得到4,6,10,6,9,15,10,15,25九个丑数,我们发现这种方法会得到重复的丑数,而且我们题目要求第N个丑数,这样的方法得到的丑数也是无序的。

indexTwo=0,indexThree=0,indexFive=0

(1)丑数数组: 1

乘以2的新丑数:2

乘以3的新丑数:3

乘以5的新丑数:5

选择三个新丑数最小的2加入丑数数组,indexTwo=1

(2)丑数数组:1,2

乘以2的新丑数:4

乘以3的新丑数:3

乘以5的新丑数:5

选择三个新丑数最小的数3加入丑数数组,indexThree=1

(3)丑数数组:1,2,3

乘以2的队列:4

乘以3的队列:6

乘以5的队列:5

选择三个新丑数最小的数4加入丑数数组,indexTwo=2

(4)丑数数组:1,2,3,4

乘以2的队列:6

乘以3的队列:6

乘以5的队列:5

选择三个新丑数最小的数5加入丑数数组,indexFive=1

(5)丑数数组:1,2,3,4,5

乘以2的队列:6

乘以3的队列:6

乘以5的队列:10

依次类推

# -*- coding:utf-8 -*-
class Solution:
    def GetUglyNumber_Solution(self, index):
        if (index <= 0):
            return 0
        uglyList = [1]
        indexTwo = 0
        indexThree = 0
        indexFive = 0
        for i in range(index-1):
            newUgly = min(uglyList[indexTwo]*2, uglyList[indexThree]*3, uglyList[indexFive]*5)
            uglyList.append(newUgly)
            if (newUgly % 2 == 0):
                indexTwo += 1
            if (newUgly % 3 == 0):
                indexThree += 1
            if (newUgly % 5 == 0):
                indexFive += 1
        return uglyList[-1]

大佬的思想真的很棒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值