我們把只包含因子2、3和5的數稱為醜數。求按從小到大的順序的第1500個醜數。
例:
6、8都是醜數,但14不是,因為它包含因子7。遍歷數字,對每個數字判斷是否只包含2、3、5因子。問題在於,有很多無用的計算,增加時間複雜度。習慣上我們把1當作第乙個醜數。
時間複雜度:>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...