题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
思路
台阶数 | 方法 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
设方法为f(n),可以很轻松的得出结论,当n>2时,f(n)=f(n-1)+f(n-2)
代码
方法1,直接暴力求解
class Solution
{
public:
int climbStairs(int n)
{
int a = 1;
int b = 2;
int tmp = 0;
if (n == 1 || n == 2) //如果台阶为1或2,直接得到结果
{
return n;
}
else
{
//n个台阶的方法=(n-1)个+(n-2)个的和
for(int i = 2; i < n ; i++)
{
tmp = b;
b = a + b;
a = tmp;
}
return b;
}
}
};
方法2,使用数组,但效率提升似乎也不大
class Solution {
public:
int climbStairs(int n) {
int res[n + 1] = {0};
res[0] = res[1] = 1;
for(int i = 2; i != n+1; ++i){
res[i] = res[i - 1] + res[i - 2];
}
return res[n];
}
};
而且如果n较大,结果会溢出