劍指offer 醜數

2021-08-18 18:06:52 字數 1603 閱讀 2361

把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

思路:如果p是醜數,那麼p=2^x * 3^y * 5^z

那麼只要賦予x,y,z不同的值就能得到不同的醜數。

如果要順序找出醜數,要知道下面幾個特(fei)點(hua)。

對於任何醜數p:

(一)那麼2*p,3*p,5*p都是醜數,並且2*p<3*p<5*p

(二)如果p現在說說演算法思想:

由於1是最小的醜數,那麼從1開始,把2*1,3*1,5*1,進行比較,得出最小的就是1

的下乙個醜數,也就是2*1,

這個時候,多了乙個醜數『2』,也就又多了3個可以比較的醜數,2*2,3*2,5*2,

這個時候就把之前『1』生成的醜數和『2』生成的醜數加進來也就是

(3*1,5*1,2*2,3*2,5*2)進行比較,找出最小的。。。。如此迴圈下去就會發現,

每次選進來乙個醜數,該醜數又會生成3個新的醜數進行比較。

上面的暴力方法也應該能解決,但是如果在面試官用這種方法,估計面試官只會搖頭吧

。下面說乙個o(n)的演算法。

在上面的特(fei)點(hua)中,既然有p「我」在前面比你小的數都沒被選上,你後面生成新的醜數一定比「我」大吧,那麼你乘2

生成的醜數一定比我乘2的大吧,那麼在我選上之後你才有機會選上。

其實每次我們只用比較3個數:用於乘2的最小的數、用於乘3的最小的數,用於乘5的最小的

數。也就是比較(2*x , 3*y, 5*z) ,x>=y>=z的,

重點說說下面**中p的作用:int p = new int ; p[0]表示最小用於

乘2比較數在陣列a中的【位置】。

# -*- coding:utf-8 -*-

class solution:

def getuglynumber_solution(self, index):

# write code here

if index == 0:

return 0

res = [1]

t2 = t3 = t5 = 0

for i in range(1,index):

if (res[i] == res[t2]*2): t2 += 1

if (res[i] == res[t3]*3): t3 += 1

if (res[i] == res[t5]*5): t5 += 1

return res[index-1]

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...

劍指Offer 醜數

我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...