動态規劃第二彈!!!
題目:爬樓梯 easy
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
思路
動态規劃題
-
考慮到達第i層的時候
在第i-2層每次跳兩步達到第i層
在第i-1層跳1步到達第i層
為什麼要考慮i-1和i-2:
這是因為本來有兩種狀态可以到達第i層
我們要把這兩種狀态找出來之後組合之後就是到達第i層的所有狀态,求出狀态轉移方程;
之後初始化;
代碼
Python
class Solution:
def climbStairs(self, n: int) -> int:
if n<=2:
return n
dp = [0]*(n+1)
dp[0]=1
dp[1]=1
dp[2]=2
sum = 0
for i in range(3,n+1):
sum = dp[2] + dp[1]
dp[1] = dp[2]
dp[2] = sum
print(sum)
return sum
C++
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n+1); //初始化數組
if (n<=2){
return n;
}
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<n+1;i++)
{
dp[i] = dp[i-2] + dp[i-1];
}
return dp[n];
}
};
空間複雜度:O(n)
時間複雜度:O(n)
優化:
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(3); //初始化數組
if (n<=2){
return n;
}
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
int sum = 0;
for(int i=3;i<n+1;i++)
{
sum = dp[1] + dp[2];
dp[1] = dp[2];
dp[2] = sum;
}
return sum;
}
};
空間複雜度:O(1)

本文來自部落格園,作者:jucw,轉載請注明原文連結:https://www.cnblogs.com/Jucw/p/15753588.html