假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

方法一 —— 记忆化递归

由于递归太耗时,可以用记忆化递归避免重复的计算。
解题过程:
1.先对n为0这种特殊情况进行处理,然后n为1和2时直接return即可
2.memo数组:存储中间结果,避免重复计算
3.接下来就是判断memo[n]是否存在,如果计算过即存在,直接返回,无需重复计算;若不存在,则进行递归计算,为前两个之和。
代码

/*** @param {number} n* @return {number}*/
const memo = []
var climbStairs = function(n) {if( n === 0) return 1if(n <= 3) return nif(memo[n]) {return memo[n]}else {memo[n] = climbStairs(n-1) + climbStairs(n-2)}return memo[n]
}

方法二 —— 动态规划(常规)

解题过程:
1.如果只有0阶或者1阶,则直接返回n。(后面直接从2阶及以上开始,防止0/1阶导致数组出现空指针)
2.dp[i]:爬到i层楼梯,有dp[i]种方法
3.从i=3开始遍历,因为必须要有前两个存在,且存在dp[n] = dp[n-1] + dp[n-2]的关系。
代码

/*** @param {number} n* @return {number}*/
var climbStairs = function(n) {if (n <= 1) return nconst dp = new Array(n)dp[1] = 1dp[2] = 2for (let i = 3; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2]}return dp[n]
}

方法三 —— 动态规划(滚动数组思想 ==> 优化空间为O(1))

解题过程:
1.先定义好三个常量,利用向左移动的思想,使得计算过程中只使用了常数个变量,且存在r = p + q的关系
2.只用常数个变量作为辅助空间,故渐进空间复杂度为 O(1)
代码

/*** @param {number} n* @return {number}*/
var climbStairs = function(n) {let p = 0, q = 0, r = 1  for (let i = 1; i<= n; i++) {p = qq = rr = p + q}return r
};

方法四 —— 动态规划(非数组法)

目前所有的动态规划都有这两种写法:用数组或非数组。不用数组的也可以理解成滑动窗口、双指针。
解题过程:
1.当有0、1、2个台阶时,分别有0、1、2种方法,用return直接返回
2.prev用于记录前一个台阶,初始值为第一个台阶,curr用于记录当前台阶,初始值为第二个台阶
3.然后从第三个台阶开始循环,执行到第n个台阶。
代码

var climbStairs = function(n) {if(n <= 2) {return n}let prev = 1let curr = 2for(let i = 3;i <= n; i++) {let temp = prev + currprev = currcurr = temp}return curr
}

LeetCode:爬楼梯相关推荐

  1. python leetcode 爬楼梯问题 斐波那契数列

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

  2. LeetCode两个爬楼梯题目解析(动态规划)

    原题: https://leetcode-cn.com/problems/climbing-stairs/description/ https://leetcode-cn.com/problems/m ...

  3. LeetCode简单题之爬楼梯

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

  4. LeetCode实战:爬楼梯

    题目英文 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...

  5. 《LeetCode力扣练习》第70题 爬楼梯 Java

    <LeetCode力扣练习>第70题 爬楼梯 Java 一.资源 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶 ...

  6. 【LeetCode】70.爬楼梯

    题目 假设你正在爬楼梯,需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶,你有多少种不同的方法可以爬到楼顶呢? 题解 方法1:基本递归 算法 基本递归即初学递归时所学的最简单.最直观的方 ...

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

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

  8. leetcode - 746. 使用最小花费爬楼梯

    746. 使用最小花费爬楼梯 -------------------------------------- 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i] (索引 ...

  9. leetcode - 70. 爬楼梯

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

  10. 动态规划——使用最小花费爬楼梯(Leetcode 746)

    题目选自Leetcode 746.使用最小花费爬楼梯 题目描述: 解题代码:C语言 int minCostClimbingStairs(int* cost, int costSize) {int pr ...

最新文章

  1. 聚类分析在用户行为中的实例_序列模式挖掘在用户行为分析中的应用
  2. 转载:sql2005 管道的另一端上无任何进程解决方法
  3. Java黑皮书课后题第5章:**5.36(商业应用:检测ISBN)使用循环简化编程练习题3.9
  4. python exit 0_python中 os._exit() 和 sys.exit(), exit(0)的用法和区别
  5. Http请求报头设置(C#)
  6. ansys怎么删除线段_科学网—ansys常用命令 - 刘敬寿的博文
  7. 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
  8. Ubuntu安装摄像头软件GTK_UVC_Viewer
  9. linux grub 删除文件,删除grub的方法(转)
  10. matlab有限元分析杆单元,有限元实验1-杆单元有限元分析
  11. 迅歌KTV服务器各型号,十大ktv必点歌曲排行榜 ktv点唱率最高的十首歌榜单公布...
  12. 你是不是麻木性自恋?(解读人性)
  13. 目标检测——day44 Tiny Object Detection in Aerial Images
  14. 近年现场比赛补题(From 2013 to 2018)[持续更新]
  15. 万字长文,分享腾讯面试攻略
  16. web测试中的测试点和测试方法总结
  17. 使用wro4j和maven在编译期间压缩js和css文件
  18. iis 发生意外错误0x8ffe2740.
  19. DIV布局——化妆品商城-功能齐全(43页) HTML+CSS+JavaScript web大作业 静态网页
  20. 实战--虚拟机用ffmpeg采集音频设备,并用rtmp推流

热门文章

  1. frp内网穿透工具实现内网穿透
  2. 苹果cms首涂第十七套DIY自适应模板带会员中心免费下载
  3. c++输入/输出 i/o_C基本输入/输出-能力问题与解答
  4. Epoll Reactor模型的部分代码[选自gxc]
  5. 滴滴的原罪就是套路太多
  6. Python超级素数
  7. 一款基于TweenMax.js的网页幻灯片(转)
  8. 交易所行情数据采集爬虫
  9. 服务器30hz显示器240hz,这次玩家说了算 三款240Hz显示器谁更强
  10. C/C++ 1e-6