来源:代码随想录
本题的力扣链接:https://leetcode-cn.com/problems/climbing-stairs/
1、题目描述:
2、思路:
3、代码:
3.1 python代码:
class Solution:
def climbStairs(self, n: int) -> int:
if n <= 2: # 防止下标越界
return n
dp = [0 for i in range(n+1)]
dp[1], dp[2] = 1, 2 # dp数组初始化
for i in range(3, n+1): # 顺序遍历,因为前两个状态决定后一个状态
dp[i] = dp[i-1] + dp[i-2] # 递推公式
return dp[n]
3.2 C++代码:
class Solution {
public:
int climbStairs(int n) {
if (n <= 2){ // 防止空指针,因为n=1时,dp[2]没有指向,其实就是防止下标越界
return n;
}
vector<int> dp(n+1);
dp[1] = 1; dp[2] = 2; // dp数组初始化
for (int i = 3; i <= n; i++){
dp[i] = dp[i-1] + dp[i-2]; // 递推公式
}
return dp[n]; // 最后一个状态就是结果
}
};
3.3 复杂度:
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
注意:空间复杂度可优化(不需要把整个dp都算出来,只需要维护两个数即可。)
4、总结:
确定一道题用动态规算法做时,按如下做法:
- 1、确定dp数组及下标的含义;
- 2、确定递推公式;
- 3、dp数组如何初始化;
- 4、确定遍历顺序;
- 5、举例推导dp数组。
最后,说明一下:上面的动态规划实际上 不需要把整个dp都算出来,只需要维护两个数即可。