1. 程式人生 > 其它 >(python version) 劍指offer 49. 醜數

(python version) 劍指offer 49. 醜數

技術標籤:動態規劃演算法python資料結構

文章目錄

題目描述

我們把只包含質因子 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
    dp[i]=2a×3b×5c
  • 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]

參考資源

用 Python 來理解動態規劃(Dynamic Programming)演演算法

演演算法筆記 - Dynamic Programming