【LeetCode-0070】经典面试题爬楼梯问题 难度:简单

1,190 阅读1分钟

原题

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。

解法

方式一:动态规划

我们是从第 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);
    }