70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
这是一个有关递归的一个问题,我是按照一个一个推的
假设一层 就是1 1次
假设两层 就是1+1 2 2次
假设三层 就是 1+1+1 1+2 2+1 3次
假设四层 就是 1+1+1+1 2+2 1+2+1 2+1+1 1+1+2 5次
不难看出这是一个斐波那契数列,至于原因就是将1加到上一次的情况中,根据1可以变成2,进行不同的排序组合,加上个可以做一个动态规划的背包问题去做,也可以直接套用斐波那契公式去处理。
方式一
public class Solution {
public int climbStairs(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);
}
}
方式二
class Solution {
public int climbStairs(int n) {
int[] ints = new int[3];
ints[0] = 1;
ints[1] = 1;
for(int i = 2; i <= n; i++){
ints[2] = ints[0] + ints[1];
ints[0] = ints[1];
ints[1] = ints[2];
}
return ints[1];
}
}
其中第二种较为巧妙,使用的是一个长度为三的数组通过遍历进行循环的值得替换,可以使结果变得更加易于理解。