假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
思路:由于每次只能走1阶或者2阶,所以,如果我们想要到达第n个台阶,那么就只能先到达第n - 1阶或者第n - 2阶
最后到达第n阶的总的次数就是到达第n - 1阶的次数加上到达第n -2阶的次数(类似于斐波那契数列)
如果用递归来写就是下面的形式,可是这种会计算大量重复的值,如果将数据保存在数组中,可大大减少计算量
class Solution {
public:
int climbStairs(int n) {
if (n == 1)
return 1;
else if (n == 2)
return 2;
else return (climbStairs(n - 1) + climbStairs(n - 2));
}
};
使用数组保存值,减少计算量
class Solution {
public:
int climbStairs(int n) {
//必须判断,否则当n = 1的时候,下方的下标会越界
if (n <= 2)
return n;
int *stair = new int[n + 1];
stair[1] = 1;
stair[2] = 2;
for (int i = 3; i <= n; i++){
stair[i] = stair[i - 1] + stair[i - 2];
}
return stair[n];
}
};