1. 程式人生 > >劍指Offer31:醜數

劍指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=5

(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]

大佬的思想真的很棒。