LeetCode:爬楼梯
假设你正在爬楼梯。需要 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:爬楼梯相关推荐
- python leetcode 爬楼梯问题 斐波那契数列
爬楼梯 问题描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: ...
- LeetCode两个爬楼梯题目解析(动态规划)
原题: https://leetcode-cn.com/problems/climbing-stairs/description/ https://leetcode-cn.com/problems/m ...
- LeetCode简单题之爬楼梯
题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶. 1 ...
- LeetCode实战:爬楼梯
题目英文 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either c ...
- 《LeetCode力扣练习》第70题 爬楼梯 Java
<LeetCode力扣练习>第70题 爬楼梯 Java 一.资源 题目: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶 ...
- 【LeetCode】70.爬楼梯
题目 假设你正在爬楼梯,需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶,你有多少种不同的方法可以爬到楼顶呢? 题解 方法1:基本递归 算法 基本递归即初学递归时所学的最简单.最直观的方 ...
- LeetCode 70爬楼梯71简化路径72编辑距离(dp)
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...
- leetcode - 746. 使用最小花费爬楼梯
746. 使用最小花费爬楼梯 -------------------------------------- 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i] (索引 ...
- leetcode - 70. 爬楼梯
70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...
- 动态规划——使用最小花费爬楼梯(Leetcode 746)
题目选自Leetcode 746.使用最小花费爬楼梯 题目描述: 解题代码:C语言 int minCostClimbingStairs(int* cost, int costSize) {int pr ...
最新文章
- 聚类分析在用户行为中的实例_序列模式挖掘在用户行为分析中的应用
- 转载:sql2005 管道的另一端上无任何进程解决方法
- Java黑皮书课后题第5章:**5.36(商业应用:检测ISBN)使用循环简化编程练习题3.9
- python exit 0_python中 os._exit() 和 sys.exit(), exit(0)的用法和区别
- Http请求报头设置(C#)
- ansys怎么删除线段_科学网—ansys常用命令 - 刘敬寿的博文
- 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
- Ubuntu安装摄像头软件GTK_UVC_Viewer
- linux grub 删除文件,删除grub的方法(转)
- matlab有限元分析杆单元,有限元实验1-杆单元有限元分析
- 迅歌KTV服务器各型号,十大ktv必点歌曲排行榜 ktv点唱率最高的十首歌榜单公布...
- 你是不是麻木性自恋?(解读人性)
- 目标检测——day44 Tiny Object Detection in Aerial Images
- 近年现场比赛补题(From 2013 to 2018)[持续更新]
- 万字长文,分享腾讯面试攻略
- web测试中的测试点和测试方法总结
- 使用wro4j和maven在编译期间压缩js和css文件
- iis 发生意外错误0x8ffe2740.
- DIV布局——化妆品商城-功能齐全(43页) HTML+CSS+JavaScript web大作业 静态网页
- 实战--虚拟机用ffmpeg采集音频设备,并用rtmp推流