动态规划
- 思路:
- 使用递归比较容易理解, 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
- 递归代码实现:
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 次即可;
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;}
};