劍指Offer 49 醜數

2021-09-11 03:14:37 字數 1292 閱讀 8013

我們把只包含因子2、3和5的數稱為醜數。求按從小到大的順序的第1500個醜數。

例:

6、8都是醜數,但14不是,因為它包含因子7。

習慣上我們把1當作第乙個醜數。

遍歷數字,對每個數字判斷是否只包含2、3、5因子。問題在於,有很多無用的計算,增加時間複雜度。

時間複雜度:>o(n)

空間複雜度:o(1)

可以發現乙個規律,醜數隻包含2、3、5的因子,因此醜數 = 醜數 * 2(3)(5),只要對每個醜數乘以2、3、5即可得到全部的醜數。下面問題就變成,如何對其排序,能得到第n個醜數。乙個醜數一定是比他小的醜數乘以2或3或5而來的,我們用乙個陣列按順序儲存所有醜數,用乙個陣列記錄2、3、5的醜數ugly_2、ugly_3、ugly_5,每次向陣列後新增ugly_22、ugly_33、ugly_55中的最小值。

時間複雜度:o(n)

空間複雜度:o(n)

def

get_ugly_num

(index)

:"""

:param index:the index of required ugly number

:return: ith ugly number

"""ugly_num =[1

] i_2 = i_3 = i_5 =

0while

len(ugly_num)

< index:

min(ugly_num[i_2]*2

, ugly_num[i_3]*3

, ugly_num[i_5]*5

))while ugly_num[i_2]*2

<= ugly_num[-1

]:i_2 +=

1while ugly_num[i_3]*3

<= ugly_num[-1

]:i_3 +=

1while ugly_num[i_5]*5

<= ugly_num[-1

]:i_5 +=

1return ugly_num[-1

]

編寫乙個程式,找出第 n 個醜數。

醜數就是只包含質因數 2, 3, 5 的正整數。

示例:

輸入: n = 10

輸出: 12

解釋: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 個醜數。

說明:1 是醜數。

n 不超過1690。

劍指offer49 醜數

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 1.每次找出乙個最小丑數res i 都會產生三個新的醜數,2 res i 3 res i 5 res i 2.如果我...

劍指 Offer 49 醜數

我們把只包含質因子 2 3 和 5 的數稱作醜數 ugly number 求按從小到大的順序的第 n 個醜數。出看這道題可能感覺能算,但是思路就非常繁瑣。解法一 這個只說說思路,既然2,3,5是該數的因子,那麼該數除以2,3,5的餘數一定是 0 那麼就讓每個數連續除以2,3,5,只到餘數不為0 結果...

劍指 Offer 49 醜數

每個醜數都等於它前面離它最遠的醜數 且還沒被乘過2 3 5 通過乘2或者3或者5得到的最小值。因此主要的任務就是找到離他最遠的還沒被乘過2的數,離他最遠的還沒被乘過3的數,離他最遠的還沒被乘過5的數,將這些數乘2,3,5,比較大小,取最小值為當前的醜數。用a,b,c作為截止目前為止最遠的還沒被乘過2...