动态规划
- 思路:
- 使用递归比较容易理解, f(n) = f(n - 1) + f(n - 2);
- 到剩余1级台阶有 f(n - 1),到剩余2级台阶有 f(n-2);
- 边界情况是
- n = 0, f(0) = 1
- n = 1, f(1) = 1
- n = 2, f(2) = 2
- 递归代码实现:
- 使用递归比较容易理解, f(n) = f(n - 1) + f(n - 2);
cpp
class Solution {
public:
int climbStairs(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return climbStairs(n - 1) + climbStairs(n - 2);
}
};
- 很遗憾的事 n = 44 时,反馈超时了;所以,需要将递归变换一下;
- 使用两个变量来缓存前两种情形的结果,根据转移方程 f(n) = f(n - 1) + f(n - 2),迭代 n 次即可;
cpp
class Solution {
public:
int climbStairs(int n) {
int p = 0;
int q = 0;
int result = 1;
for (int step = 1; step <= n; ++step) {
p = q;
q = result;
result = p + q;
}
return result;
}
};