leetcode的python實現 刷題筆記70:爬樓梯(動態規劃)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
示例 1:
輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1 階 + 1 階 2. 2 階
示例 2:
輸入: 3 輸出: 3 解釋: 有三種方法可以爬到樓頂。 1. 1 階 + 1 階 + 1 階 2. 1 階 + 2 階 3. 2 階 + 1 階
class Solution(object): def climbStairs(self, n): """ :type n: int :rtype: int """ current = [0] * (n + 1) current[0] = 1 current[1] = 1 for i in range(2, n + 1): current[i] = current[i - 1] + current[i - 2] return current[n] sl = Solution() print(sl.climbStairs(3)) print(sl.climbStairs(5)) print(sl.climbStairs(7)) print(sl.climbStairs(9))
思路:
1.由題目我們可以知道,當你爬到第n個樓梯的時候,你有兩種選擇,第一種是從第n-1個樓梯上走1個樓梯,第二種是從第n-2個樓梯上走2個樓梯.因此我們可以得到這樣的一個式子:f(n)=f(n-1)+f(n-2)。
2.所以我們可以定義一個長度為n+1的陣列,用來存放不同的數字相對應的解決方案,這裡要注意的是當樓梯長度等於0或者1 的時候我們都看作是隻有一種走法。
總結:
1.斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
2.儘量不使用遞迴的方法,因為遞迴會佔用過多的儲存空間和執行時間。
3.所有遞迴的方法都可以轉化成非遞迴的方法,也就是動態規劃
4.動態規劃:通過把大問題分解為相對簡單的子問題的方式求解複雜問題的方法。適用於有重疊子問題和最優子結構性質的問題
5.思想:將大問題分解成小問題,然後合併小問題的解,進而得到大問題的解。實際上就是解決了小問題之後,把小問題的解儲存成一個表,當要使用的時候就查表,直接呼叫之前的到的結果。
6.動態規劃和分治法的思想很類似,都是把化大為小,逐個擊破。區別在於分治法分成的小問題都是相互獨立的,需採用遞迴的做法,而動態規劃分成的小問題之間有一定的聯絡,可以通過查詢來直接使用。