爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
暴力解法
分析题目:题目问的是爬法,不是爬了几阶。
n=1 爬到1阶,此时也只有一种爬法。
n=2 爬到第2阶,此时可以爬一阶或两阶,有两种爬法。
n=3 爬到第3阶,此时可以先爬一阶,再爬一阶,再爬一阶或者先爬一阶再爬两阶或者先爬两阶再爬一阶,即3种爬法。
按照上述规律,依次类推即可。
代码展示
public static int climb(int n){
if(n<=1){
return 1;
}
return climb(n-1)+climb(n-2);
}
公式改进
从第一种分析思路,得出符合斐波那契数列规律(数列从第3项开始,每一项都等于前两项之和)。
公式
//斐波那切数列公式解法
public static int climb2(int n){
double sqrt_5 = Math.sqrt(5);//平方根
double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);//幂 eg Math.pow(x,y)---x的y次幂
return (int)(fib_n / sqrt_5);
}
动态规划思想
动态规划知识不太了解,此种做法,并未搞懂,只是按照别人的解法,走了一遍。
public static int climb3(int n){
int[] db=new int[n+1];
db[0]=1;
db[1]=1;
for (int i = 2; i <=n ; i++) {
db[i]=db[i-1]+db[i-2];
}
return db[n];
}
观察思路:通过数组实现,没琢磨出来和动态规划有啥关系?