原题
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。
- 来源:力扣(LeetCode)
- 难度:简单
- 链接:leetcode-cn.com/problems/cl…
解法
方式一:动态规划
我们是从第 0 级开始爬的,所以从第 0级爬到第 0 级我们可以看作只有一种方案,即 f(0)=1;从第 0 级到第 1 级也只有一种方案,即爬一级,f(1) = 1。这两个作为边界条件就可以继续向后推导出第 n 级的正确结果
- 可以推知:第n阶的方案就是第n-1和n-2阶方案的和,以此类推类似斐波那契数列Fn = Fn-1+Fn-2
//方式一:动态规划
//第n阶的方案就是第n-1和n-2阶方案的和,以此类推类似斐波那契数列Fn = Fn-1+Fn-2
public int climbStairs(int n){
if(n==1){
return 1;
}
int first = 1;//第一阶1种方法
int second = 2;//第二阶两种方法
for (int i=3;i<=n;i++){//从第三阶开始求
int third = first + second;//当前阶的方案=上一阶 + 上上阶
first = second;//记录当前阶的上一阶,作为下一阶的上上阶
second = third;//记录当前阶,作为下一阶的上一阶
}
return second;
}
方式二:菲波那切数列通项公式推导
//方式二:斐波那契通项公式推导
public int climbStairs2(int n){
double sqrt5 = Math.sqrt(5);
double fibn = Math.pow((1 + sqrt5) / 2, n + 1) - Math.pow((1 - sqrt5) / 2, n + 1);
return (int) Math.round(fibn / sqrt5);
}