一、题目描述:
有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法。
二、测试用例:
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
三、解题思路
我们将第i次登上楼顶所使用的次数定义为f(i),那么根据题意,我们最后一步迈上楼顶可能是迈了两步,也可能是迈了一步。所以有关系式:
我们发现这和斐波拉契数列是一样的,所以本问题其实就是一个斐波拉契数列问题。
四、代码思路
斐波拉契数列有很多种代码思路,我们首先用p,q,r来存储三个斐波拉契数据,这里我们用动态规划的方法来解决,即不断更新小数组p,q,r的值。
初始条件下:f(0)=1;f(1)=1;r=f(0)+f(1)=2;
n | p | q | r | 输出 |
---|---|---|---|---|
1 | 1 | 1 | 2 | 1 |
2 | 1 | 2 | 3 | 2 |
3 | 2 | 3 | 5 | 3 |
4 | 3 | 5 | 8 | 5 |
…… | ||||
i | p | q | r | q |
我们只需要遍历[0,n),,返回q的值即可。
五、leetcode代码
class Solution
{
public:
int climbStairs(int n)
{
long long p=1,q=1,r=2,temp=0;
for(int i=0;i<n;i++)
{
temp=r;//使用temp存储r的值,不然会丢失
r=q+r;
p=q;
q=temp;
}
return p;//之所以返回p,是因为循环最后一次过后,q的值已经被赋值给了新的p
}
};