zoukankan      html  css  js  c++  java
  • [LeetCode系列]爬梯问题的递归解法转换为迭代解法

    有一个n阶的梯子, 你每次只能爬1阶或2阶, 请问共有多少种登顶的爬法?(正好爬完n阶, 不能多也不能少)

    本题最优解是直接套用菲波那切数列即可(因为菲波那切数列的第n个元素正好等于第n-1个元素和第n-2个元素的和, 与本题的要求完全相同).

    递归解法:

    1     int climbStairs(int n) {
    2         if (n < 3) return n;
    3         return climbStairs(n-1) + climbStairs(n-2);
    4     }

    思路很清晰, 递归到当前阶数小于3阶时返回种类(因为比较容易计算, 并非一定是3阶), 这也是求解菲波那切数列的递归解法.

    然而实际中这种解法对栈要求过大, 非常容易溢出. 因此有必要转化为迭代算法:

    1     int climbStairs(int n) {
    2         vector<int> count(n+1);
    3         count[0] = 0;
    4         count[1] = 1;
    5         count[2] = 2;
    6         for (int i = 3; i <= n; i++)
    7             count[i] = count[i-1] + count[i-2];
    8         return count[n];
    9     }

    简单总结一下: 从递归->迭代时, 只需要把思考过程转换为这种数列求解的思路, 从前几个元素开始向后推导即可, 推导的关系则与递归的返回表达式非常相似.

  • 相关阅读:
    搜索入门练习题3 全组合 题解
    搜索入门练习题1 素数环 题解
    搜索入门练习题2 全排列 题解
    二分 大纲
    凸包
    快速幂&矩阵快速幂
    最长不下降子序列的优化
    poj 3190 Stall Reservations
    poj 2431 Expedition

  • 原文地址:https://www.cnblogs.com/lancelod/p/3907402.html
Copyright © 2011-2022 走看看