LeetCode刷题——70. 爬楼梯
题目
假设你正在爬楼梯。需要 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 阶
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
思路
对于这样一个问题,我们先来思考下能否递归的解决,它内部是否有递归的结构。
我们自顶向下的思考问题,直接考虑第nnn阶台阶,并且假设它下面的n−1n-1n−1阶,n−2n-2n−2阶等子问题都已经解决了。
如果我们要想爬上nnn阶台阶,因为一次要么爬111阶,要么爬222阶,所以爬nnn阶台阶有两种可能。
从n−1n-1n−1阶再爬111阶或者从n−2n-2n−2阶再爬222阶。
不难看出这是一个递归问题,我们把问题转换为爬n−1n-1n−1阶有多少种方法和爬n−2n-2n−2阶有多少种方法。然后把这两个问题的答案相加就好了。这样把一个大的问题转换为两个小问题。
用同样的思路可以求出爬n−1n-1n−1阶和爬n−2n-2n−2阶的方法数。从上面这个递归树可以看出,存在很多重复子问题。
下面我们先写出按照这种思路解决问题的递归算法。
代码
递归
class Solution:def climbStairs(self, n: int) -> int:# 递归的终止条件if n == 1:return 1if n == 2:return 2return self.climbStairs(n-1) + self.climbStairs(n-2)
虽然思路是对的,但是递归的方式是比较低效的,这里导致了计算超时。参阅LeetCode刷题之动态规划思想,我们可以将其改成记忆化搜索的方式,解决重叠子问题。
因为爬2阶台阶有2种方法,和斐波那契数列很像。这里的递归终止条件还可以写成
if n == 0:return 1 if n == 1:return 1
这样这个问题就是斐波那契数列的应用。
记忆化搜索
dp = {}class Solution:def climbStairs(self, n: int) -> int:# 递归的终止条件if n == 0:return 1if n == 1:return 1if n not in dp: # 如果没有计算过再去计算dp[n] = self.climbStairs(n-1) + self.climbStairs(n-2)return dp[n]
最后改成动态规划也就很简单了。
动态规划
class Solution:def climbStairs(self, n: int) -> int:if n == 1:return 1dp = [1] * (n+1) #dp[0] = 1 , dp[1] = 1 ,dp[2]以后的通过下面的式子计算for i in range(2,n+1):dp[i] = dp[i-1] + dp[i-2]return dp[n]
动态规划不需要递归求解,是一种自底向上的求解思想。
LeetCode刷题——70. 爬楼梯相关推荐
- 学渣的刷题之旅 leetcode刷题 70.爬楼梯(动态规划)
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 输入: 2 输出: 2 解释: 有两种方法可以爬 ...
- LeetCode简单题之爬楼梯
题目 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶. 1 ...
- 【LeetCode笔记】70. 爬楼梯(Java、动态规划)
文章目录 题目描述 代码 & 思路 1. 动态规划 O(n).O(n) 2. 动态规划 O(n).O(1) 题目描述 DP 入门题了属于是 代码 & 思路 1. 动态规划 O(n).O ...
- 小黑静待身边朋友的考研佳音,明天准备面试,在白塔咖啡帐篷里的一下午的leetcode之旅:70. 爬楼梯
小黑代码:记忆化搜索 class Solution:def climbStairs(self, n: int) -> int:# 记忆字典map_ = {}# 递归搜索函数def dfs(res ...
- LeetCode刷题遇到的小知识点总结
文章目录 1. 需要判断输入的两个参数的大小/长度 2. 数学分式的化简 3. 二叉树操作的小总结 4. MySQL分组内取前几名的问题 5. SQL中的小问题 6. 对哈希表的初步理解 (1)初步理 ...
- LeetCode刷题实战70:爬楼梯
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- LeetCode 70爬楼梯71简化路径72编辑距离(dp)
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注这个潇洒青年一起飞,回 ...
- leetcode - 70. 爬楼梯
70. 爬楼梯 -------------------------------------- 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以 ...
- Python描述 LeetCode 70. 爬楼梯
Python描述 LeetCode 70. 爬楼梯 大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包括前端开发.pyt ...
- 变形版汉诺塔:LeetCode:70爬楼梯
70. 爬楼梯 题目链接:70:爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1 ...
最新文章
- 打破“维度的诅咒”,机器学习降维大法好
- 中国信通院:2019年Q1全球人工智能产业数据报告
- java文件流读取异常_Java IO流的FileInputStream读取文件的问题,不同写法输出不一样...
- 架构师速成4.6-软技能和硬技能
- 作者:王文生,中国农业科学院农业信息研究所副所长、研究员。
- pku1189 钉子和小球
- MongoDB的存储结构及对空间使用率的影响
- 基于强化学习的关系抽取和文本分类
- steam游戏图标失效_如何将非Steam游戏添加到Steam并应用自定义图标
- js几种常见的设计模式
- 一次惨痛的微软AA面经历
- DDR SDRAM内存发展历程
- 中学-综合素质【1】
- windows2003通过iis配置ftp服务器
- “创宇ADS”获公安部颁发《计算机信息系统安全专用产品销售许可证》!
- 计算机ps课如何把玫瑰花绿色,ps变色教程 利用PhotoShop将红玫瑰变成蓝色玫瑰
- web服务器—nginx
- 申请ssl 验证域名 失败了 中间证书
- python数字和字符串可以运算吗_python数字和字符串对象
- 3D空间中射线与三角形的交叉检测算法【转】