目录
1.爬楼梯

对于这道题,我们发现到达楼顶可以分为两部分,在楼顶的前一个位置跳一步到达,在楼顶的前两个位置跳两步到达,所以我们可以设一个方程来表示
dp[n]表示到达第n阶楼梯的方法数量,通过上面可以得出dp[n] = dp[n - 1] + dp[n - 2]这样的通式
开这个dp数组的时候可以开n的大小,也可以开n + 1,在这里选择n + 1的大小,这样从dp[1]到dp[n]刚好对应
在dp中,我们需要初始化dp[1]和dp[2],因为dp需要用到前两个位置,遍历的时候从3开始
cpp
class Solution {
public:
int climbStairs(int n) {
if(n == 1 || n == 2) return n;
vector<int> dp(n + 1);
dp[1] = 1, dp[2] = 2;
for(int i = 3; i <= n; i++)
dp[i] = dp[i - 1] + dp[i - 2];
return dp[n];
}
};
我们可以进行空间优化,在这里我们发现只需要用到前两个位置,所以就不需要开数组了,用两个变量来表示前两个值
cpp
class Solution {
public:
int climbStairs(int n) {
if(n == 1 || n == 2) return n;
int a = 1, b = 2;
for(int i = 3; i <= n; i++)
{
int c = a + b;
a = b;
b = c;
}
return b;
}
};