LeetCode #70 Climbing Stairs - 刷題之旅
1 題目描述
爬樓梯,每次可以爬一階或是兩階,求爬到第n階有幾種方法。
2 解法
按照之前的介紹LeetCode 課前預習 - 掌握 Dynamic Programming 的思維指南,我很推薦把每一種步驟都嘗試寫出來看看,分別是:
- Step1: Recursive
- Step2: Recursive with Memoization
- Step3: Iterative + Tabulation
- Step4: Iterative with Constant Space
Step1: Recursive
最基本也是最蠢的就是我們要先發現,基本上走樓梯的方法數量是f(n) = f(n-1) + f(n-2)
,這樣的遞迴式,我們可以直接寫出來。
1 | def climbStairs(n): |
Step2: Recursive with Memoization
那我們就思考,是不是某些已經算過的子問題,我們可以直接拿來用,這樣就不用重複計算了。
因此我們需要一個dict來記錄已經算過的子問題。使用dict的好處是可以使用O(1)的時間複雜度來查找。
1 | def climbStairs_step2(self, n: int) -> int: |
Step3: Iterative + Tabulation
接下來,因為Recursive的缺點是有call stack size的限制,所以我們可以使用Iterative,來避免這個問題
1 | def climbStairs_step3(self, n: int) -> int: |
Step4: Iterative with Constant Space
最後,我們再思考一下,目前時間複雜度已經到極限了,但是空間複雜度是不是可以再省一點?因為我們只需要前面兩個步驟的結果就可以了。
1 | def climbStairs_step4(self, n: int) -> int: |
3 結論
這題是Easy,所有的dynamic最基本的就是要先想到Recursive的解法,才可以進去DP的大門。否則一切都是空談。
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Shannon's Blog 🐟 技術 | 生活 | 旅行! 如果你覺得我的文章有幫助,希望你可以到我的 github 給我一個 star ⭐️ Shannon Blog Repo
評論