假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
提示:
1 <= n <= 45
是一道有趣的题目,可以用来当成动态规划的入门练习
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) {
return 1;
}
int prev1 = 1;
int prev2 = 1;
for (int i = 2; i <= n; ++i) {
int current = prev1 + prev2;
prev1 = prev2;
prev2 = current;
}
return prev2;
}
};
-
prev1和prev2的含义:prev1表示爬到前一阶楼梯的方法数。prev2表示爬到前两阶楼梯的方法数。
例子分析
假设 n=5,即求解爬到第 5 个台阶的方法总数。
-
初始状态:
prev1 = 1(f(1))prev2 = 1(f(0))
-
迭代过程:
- i=2i = 2i=2:
current = prev1 + prev2 = 1 + 1 = 2(f(2))- 更新:
prev1 = 1,prev2 = 2
- i=3i = 3i=3:
current = prev1 + prev2 = 1 + 2 = 3(f(3))- 更新:
prev1 = 2,prev2 = 3
- i=4i = 4i=4:
current = prev1 + prev2 = 2 + 3 = 5(f(4))- 更新:
prev1 = 3,prev2 = 5
- i=5i = 5i=5:
current = prev1 + prev2 = 3 + 5 = 8(f(5))- 更新:
prev1 = 5,prev2 = 8
- i=2i = 2i=2:
-
结果:
prev2最终为 8,即爬到第 5 个台阶的方法总数。