劍指Offer31:醜數
阿新 • • 發佈:2018-12-19
思路:
通俗易懂的解釋:
首先從醜數的定義我們知道,一個醜數的因子只有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]
大佬的思想真的很棒。