(python version) 劍指offer 49. 醜數
阿新 • • 發佈:2021-02-20
文章目錄
題目描述
我們把只包含質因子 2、3 和 5 的數稱作醜數(Ugly Number)。求按從小到大的順序的第 n 個醜數。
來源:力扣(LeetCode)
解題思路
- 利用動態規劃可以達到 O(N) 線性時間完成
- 用 Python 理解動態規劃:分治法(divide and conquer)+記憶法 (memorization)
- 分治法的流程是切割問題、解決問題、合併解答。
- 在找尋問題時子問題與原問題相同但範圍不同被稱為 遞迴(recurrence)
- 動態規劃是在求解過程把子問題答案先儲存在記憶體內
- 動態規劃是分治法的延伸。當遞迴分割出來的問題,一而再、再而三出現,就運用記憶法儲存這些問題的答案,避免重複求解,以空間換取時間。動態規劃的過程,就是反覆地讀取資料、計算資料、儲存資料。
- 題目要返回第 N 個醜數,所以 dp 為 1xN 的 list,最終答案可以經由查表 dp 返回 dp[-1]
- 整數分解=質因數分解:是將一個正整數寫成幾個因數的乘積。
由於醜數可以視為 2,3,5 這三個因數的乘積,以下式表達:
d p [ i ] = 2 a × 3 b × 5 c dp\lbrack i\rbrack=2^a\times 3^b\times5^c - Don’t: 從1,2,3,4,… 判斷是醜數 or 不是醜數(會超過時間限制)
Python 程式碼
class Solution:
def nthUglyNumber(self, n: int) -> int:
dp=[1] * n
a=b=c=0
for i in range(1, n):
n2 = dp[a]*2
n3 = dp[b]*3
n5 = dp[c]*5
dp[i] = min(n2, n3, n5)
if dp[i] == n2:
a+=1
if dp[i] == n3:
b+=1
if dp[i] == n5:
c+=1
return dp[-1]