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

问题: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)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 8,147评论 0 6
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,430评论 0 13
  • 递归:如何用三行代码找到“最终推荐人” 推荐注册返佣金的这个功能我想你应该不陌生吧?现在很多 App 都有这个功能...
    GhostintheCode阅读 5,007评论 0 6
  • 今天晨读文章发布的时候我正在做正面管教的方法的笔记,笔记内容来源于简尼尔森的《正面管教》和德雷克斯的《孩子,挑战》...
    楚丹丹阅读 2,425评论 2 5
  • 昨天自行车坏了,放到修理店晚上忘了取,今早准备溜达上班。走到小区门口,看到两辆摩拜单车,于是下载APP,交定金,开...
    konlyone阅读 1,328评论 0 0

友情链接更多精彩内容