题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶
示例 2:
输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶
解题思路:
假设 f(n) 是上到第i个台阶的走法种数,所以有:
f(0) = 1;
f(1) = 1;
f(2) = 2; 上到第2个台阶:(1,1), (2)
f(3) = 3; 上到第3个台阶:(1,1,1),(1,2), (2,1)
f(4) = ?如果第4个台阶是最后的台阶,那么上到最后一步只有两种方式:走1个,或者走2个台阶。如果走2个,那上次走到的是第2个台阶(n-2),考虑上到第2个台阶有f(2) = 2种方式;如果走1个,那上次走到的是第3个台阶,而上到第3个台阶有f(3) = 3种方式;所以 f(4) = f(2) + f(3),依次类推,即 f(n) = f(n-2) + f(n-1)。
C++代码:
递归解法:
class Solution {
public:
int climbStairs(int n) {
if (n == 0 || n == 1)
return 1;
else
return climbStairs(n-1) + climbStairs(n-2);
}
};
使用数组解法,我们需要创建一个大小为n+1的数组。如果说递归解法是自顶向下的话,数组实现动态规划即是自底向上。在这个算法中,和递归解法类似,只是将f(n)=f(n-1)+f(n-2)
换成 result[n] = result[n-1]+result[n-2]
即可。
class Solution {
public:
int climbStairs(int n) {
vector<int> result(n+1);
result[0] = 1; // 上到第0个台阶的方式
result[1] = 1; // 上到第1个台阶的方式
for (int i = 2; i < n+1; i++){
result[i] = result[i-1] + result[i-2]; // 上到第i个台阶的方式
}
return result[n];
}
};