题目:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
提示:
- 1 <= n <= 45
题解:
(参考力扣官方题解)
C
方法一:
用f(x)表示爬到第x级楼梯的方法数,由于每次只能爬1或2个台阶,最后一步可能爬1个台阶或者2个台阶,所以爬第x级台阶的方法数就等于爬第x-1级台阶的方案数和第x-2级台阶的方案数的和,就可以得到如下公式:
f(x) = f(x-1) + f(x-2)
对应代码如下:
int climbStairs(int n)
{
int p=0,q=0,r=1;
for(int i=1;i<=n;i++)
{
p=q;
q=r;
r=p+q;
}
return r;
}
方法二:
根据公式f(x) = f(x-1) + f(x-2),推导出通项公式。
利用这个公式就可以直接求第n项了。
由于斐波那契数列首项是0,而爬楼梯是从第1楼开始,所以将公式中的n换为n+1.
int climbStairs(int n)
{
return 1/sqrt(5.0)*(pow((1+sqrt(5.0))/2,n+1)-pow((1-sqrt(5.0))/2,n+1));
}