70.爬楼梯

114 阅读1分钟

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];
    }
}

其中第二种较为巧妙,使用的是一个长度为三的数组通过遍历进行循环的值得替换,可以使结果变得更加易于理解。