假設你正在爬樓梯。需要 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 階
思路:
1、題目分析
有多少方法可以爬到樓頂,那第n層有多少方法一定和第n-1層有關係。所以不用多說動態規劃。
2、解題分析
- 如果樓層小於等於2直接返回;1層返回1,2層返回2(跨一步+兩小步)
- 如果大於3層就可採用動態規劃的方法解決了,我們用 f(x) 表示爬到第 x 級臺階的方案數,考慮最後一步可能跨了一級臺階,也可能跨了兩級臺階(往後退一步跨兩步),所以我們可以列出如下式子:f(x)=f(x−1)+f(x−2)
- 當前的狀態和上個狀態和上上個狀態都有關係,狀態轉移方程列出來了題目就已經解決了
- 當然動態規劃需要一個數組就存儲這個狀態dp[0]~dp[n-1].
- 不優化:直接用數組存儲時間複雜度O(n)
- 優化:利用滾動數組思想,只和x-1和x-2狀態有關;所以利用這樣等價轉換:a,b=b,a+b。完成空間複雜度的降低
代碼如下:
class Solution:
def climbStairs(self, n: int) -> int:
#動態規劃
dp=[0 for i in range(n)]
if n==2:
return 2
if n==1:
return 1
dp[0]=1
dp[1]=2
for i in range(2,n):
dp[i] = dp[i-1]+dp[i-2]
return dp[-1]
#降低空間複雜度,結果只和前兩個狀態有關
a,b=1,2
for i in range(2,n):
a,b = b,a+b
return b