美文网首页
算法:10阶层楼梯,每次只能走一阶或两阶,问有多少种走法?

算法:10阶层楼梯,每次只能走一阶或两阶,问有多少种走法?

作者: 小的橘子 | 来源:发表于2019-06-08 21:32 被阅读0次

问题:10阶层楼梯,每次只能走一阶或两阶,问有多少种走法?

递归法

设F(n)是爬到n阶层的走法数,那么
F(10) = F(9) + F(8)
F(9) = F(8) + F(7)
...
F(3) = F(2) + F(1)
F(1) 为1中走法,F(2)为2种走法,故编程如下

int getClimbWays(int n) {
    if (n < 1) {
        return 0;
    }
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 2;
    }
    return getClimbWays(n - 1) + getClimbWays(n - 2);
}

计算结果是89种,通过该方法就可以计算任意阶层的走法。
复杂度分析:
时间复杂度:O(2n),因为每次调用都会执行该方法两次。这个复杂度随着n的增大,执行时间会急剧增加,故需要优化。

这个方法的递归图如下



可以看到有很多重复的递归调用,我们可将已经计算的结果通过Hash表保存起来,如果需要时取出即可,这就称为备忘录算法

备忘录算法

class Solution {
    // 利用Hash表存储
    HashMap<Integer, Integer> map = new HashMap<>();
    int getClimbWays(int n) {
        if (n < 1) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        if (map.containsKey(n)) {
            return map.get(n);
        }
        int value = getClimbWays(n - 1) + getClimbWays(n - 2);
        map.put(n, value);
        return value;
    }
}

复杂度分析:
时间复杂度:O(n),需要方法调用的只有F(1)->F(n)各一次
空间复杂度:O(n),HashMap种会存储n-2个数据,对于F(1)和F(2)不会存储

由于引入了HaspMap导致空间复杂度增大。我们是否可以继续优化?原问题可以拆分为小问题,然后求解,F(1) = 1,F(2) = 2,F(3) = F(1) + F(2) ... F(n) = F(n-2) + F(n-1),我们可以从最小问题入手,发现后面解时前面两个解的和,我们就可以采用迭代的方式的完成。这就是动态规划

动态规划

class Solution {
    int getClimbWays(int n) {
        if (n < 1) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2;
        int a = 1;
        int b = 2;
        for (int i = 2; i < n; i++) {
            int temp = a + b;
            a = b;
            b = temp;
        }
        return b;
    }
}

复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)

相关文章

  • 算法:10阶层楼梯,每次只能走一阶或两阶,问有多少种走法?

    问题:10阶层楼梯,每次只能走一阶或两阶,问有多少种走法? 递归法 设F(n)是爬到n阶层的走法数,那么F(10)...

  • 70. Climbing Stairs

    给出一个楼梯阶数,每次只能走一阶或两阶,求所有的走法 比较笨的方法 类似鸡兔同笼问题,设置oneStepCount...

  • 算法题

    1.一段n个台阶组成的楼梯,小明从楼梯的最底层向最高层处前进,他可以一次迈一阶或两阶,问:他有多少种不同的走法? ...

  • N阶楼梯上楼问题

    题目描述:N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。看到题目我的第一反应是求组合数,设走一阶的次...

  • 动态规划 (一)

    爬楼梯问题 问题描述:现在总共有10层台阶,一只青蛙一次只能跳一阶或两阶。问总共有多少种跳法?   分析一波: 青...

  • 015-climbingStairs

    描述 有n阶楼梯,每次可以上一阶或者两阶楼梯,一共有多少种方法走完这些楼梯。 分析 设f(n)表示走第n阶楼梯的不...

  • 算法-爬楼梯问题

    一个N阶的楼梯,每次能1或着2阶,问走n阶的楼梯有多少种走法? 分析可知在走第n阶的时候,是与第n-1阶和n-2阶...

  • 笔记03:爬楼梯递归问题

    假设楼梯有N阶,一次只能爬一阶或两阶,问有几种爬楼梯的方法? N=1, 1种N=2, 2种N=3, 3种N=4, ...

  • 动态规划(一):爬楼梯

    题目 一个 阶的楼梯,每次能走 1~2 阶,问走到 阶一共多少种走法 分析 因为每次能走 1~2 阶,所以第 ...

  • 动态规划-爬楼梯-Java实现(1)

    有一座高10级台阶的楼梯,从下往上走,一次只能向上1级或2级台阶,一共有多少种走法? 结题思路: 1.递归:时间复...

网友评论

      本文标题:算法:10阶层楼梯,每次只能走一阶或两阶,问有多少种走法?

      本文链接:https://www.haomeiwen.com/subject/olabxctx.html