假设你正在爬楼梯。需要 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 个台阶的方法总数。