一个有两个题解,
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) return n; // 因为下面直接对dp[2]操作了,防止空指针
vector<int> dp(n + 1);
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) { // 注意i是从3开始的
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
这里的dp(n+1)的意思是是vector<int> dp (n + 1, 0) 表示一个长度为 n+1 ,每个元素为 int 类型的一维向量(即一个数组)
为什么要n+1呢——因为有dp[0]占了一格内存
这个的时间复杂度和空间复杂度都为
时间复杂度:$O(n)$
空间复杂度:$O(n)$
再次基础上怎么做优化呢?
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) return n;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
int sum = dp[1] + dp[2];
dp[1] = dp[2];
dp[2] = sum;
}
return dp[2];
}
};
就改一下循环即可,用do[1],dp[2],sum,这三个数组里的数不停的变化,进而使空间复杂度降为
$空间复杂度:$O(3)$
时间复杂度:$O(n)