题目

假设你正在爬楼梯,需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶,你有多少种不同的方法可以爬到楼顶呢?

题解

方法1:基本递归

算法

基本递归即初学递归时所学的最简单、最直观的方法。
假设你爬了 n 段楼梯,则爬上当前楼梯所拥有的方法数是爬上 n-1 段楼梯的方法数加上爬上 n-2 段楼梯的方法数。

代码

class Solution {public:int climbStairs(int n) {if (n == 1 || n == 2)return n;elsereturn climbStairs(n - 1) + climbStairs(n - 2);}
};

分析

此方法最简单、直观、易懂,逻辑也很清晰。
但底层的数字被大量重复计算,很容易超时。

  • 时间复杂度:O(2n)O(2^n)O(2n)
  • 空间复杂度: O(n)O(n)O(n)

图源LeetCode官方题解


方法2:记忆化递归

算法

鉴于基本递归会大量重复计算底层数字,那么我们可以想到,不妨将计算过的数字存起来,需要的时候先看是否已经计算,算过的直接取出来,没有算过的计算,这样每个数字都只会计算一次。

代码

class Solution {public:int climb(int n, int mem[]) {if (n == 1 || n == 2)return n;if (mem[n - 1] == 0)mem[n - 1] = climb(n - 1, mem) + climb(n - 2, mem);return mem[n - 1];}int climbStairs(int n) {int *mem = new int[n] {0};return climb(n, mem);}
};

分析

通过维护一个mem数组,将算过的数字从第3个空间开始存起来,前两个空间位置本来应该放第1、2个楼梯的方法数,但不便于创建时指定,故干脆空着了。
mem[i - 1] 等于0,表明位置 i-1 的方法数没算出来,需要计算。最后返回 mem[i - 1] 就行了。

  • 时间复杂度:O(n)O(n)O(n),可以满足LeetCode不超时
  • 空间复杂度:O(n)O(n)O(n)

方法3:斐波那契循环

算法

其实从前面的解题思路可以得知,爬楼梯本质上就是斐波那契数列。故我们可以使用循环计算斐波那契。

代码

class Solution {public:int climbStairs(int n) {if (n == 1 || n == 2)return n;int a = 1, b = 2, t;for (int i = 0; i < n - 2; i++) {t = b;b += a;a = t;}return b;}
};

分析

之所以是 for (int i = 0; i < n - 2; i++) ,是因为要比n少循环2次,这个可以代入3来理解:计算3的时候只需要循环一次即可,故3减去2即得1。
该算法时间复杂度为 O(n) ,需要从前往后计算n次,空间复杂度只有 O(1) ,因为没有动态创建空间。


动态规划

算法

可以看出,这个问题得最优解可从它的子问题得最优解得出,即:
i 个楼梯最多方法数 = 第 i-1 个楼梯最多方法数 + 第 i-2 个楼梯最多方法数:
dp[i] = dp[i - 1] + dp[i - 2]

代码

class Solution {public:int climbStairs(int n) {if (n == 1 || n == 2)return n;int *dp = new int[n];dp[0] = 1;dp[1] = 2;for (int i = 2; i < n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n - 1];}
};

分析

由于每一次的最优解都取决于前两次的最优解,故从前往后得出所有楼梯的最优解并存在dp数组中,大体上跟上面的斐波那契数列算法非常相似,时间复杂度与空间复杂度均为 O(n)

【LeetCode】70.爬楼梯相关推荐

  1. LeetCode 70爬楼梯71简化路径72编辑距离(dp)

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...

  2. Python描述 LeetCode 70. 爬楼梯

    Python描述 LeetCode 70. 爬楼梯   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端开发.pyt ...

  3. leetcode - 70. 爬楼梯

    70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...

  4. 变形版汉诺塔:LeetCode:70爬楼梯

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

  5. LeetCode 70. 爬楼梯 (递归斐波那契 | 动态规划)

    70. 爬楼梯 解法1 (暴力递归) 推出递推式子:f(n) = f(n - 1) + f(n - 2) 是一个斐波那契数列,用递归 class Solution {public int climbS ...

  6. LeetCode - 70. 爬楼梯(人肉递归、动态规划)2

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

  7. Leetcode 70.爬楼梯

    Time: 20190904 Type: Easy 考察:动态规划 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注 ...

  8. Leetcode 70. 爬楼梯 动态规划 c语言

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

  9. 84. Leetcode 70. 爬楼梯 (动态规划-基础题)

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶.每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶. 1. 1 阶 ...

  10. leetcode 70. 爬楼梯(C语言)

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

最新文章

  1. c++ const 类型检查
  2. 20220401 A满秩,B满秩,AB一定满秩
  3. GridView RowCommand事件中取得當前行
  4. 【POJ - 3020】Antenna Placement (匈牙利算法,二分图最小边覆盖)
  5. oracle打开 txt文件,oracle 导入txt文件
  6. 【开发者笔记】利用ab命令对接口进行压力测试
  7. eclipse优化记录
  8. android平板管理工具,安卓平板如何提升使用效率,这17款软件你应该知道
  9. 外贸报价后如何跟进客户?winseeing可快速报价展示样品
  10. mysql 转大写_mysql将字符串转换为大写的方法
  11. 基于Android studio+SSH的单词记忆(背单词)APP设计
  12. SpringBoot发送html邮箱验证码
  13. poi 操作Excel 删除行内容和直接删除行(poi3.17测试可用)
  14. win10关闭电池保护模式_Windows10如何关闭电源保护模式?
  15. 西安索命拉土车!(又遇上一场车祸)
  16. FPGA : 学习交流的网站和社区
  17. VMware亮相全球云计算大会
  18. 爬虫selenium教程
  19. Spoken English Practice(I'm gonna do something I never thought I'd be able to)
  20. 《深入浅出SQL》问答录

热门文章

  1. verilog编译指令
  2. DOS 和 Linux 常用命令的对比
  3. Python-Numpy函数-tile函数
  4. select frame 什么意思?
  5. hiho_1050_树中的最长路
  6. Android中Google Drive显示黑屏问题分析
  7. [Python]一行代码判断请求参数是否正确
  8. 招不招新人?IT经理很纠结.
  9. 计算字符串和文件的MD5值
  10. Ogre貌似开始推荐MYGUI了~~