题目

假设你正在爬楼梯。需要 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. 爬楼梯相关推荐

  1. 学渣的刷题之旅 leetcode刷题 70.爬楼梯(动态规划)

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

  2. LeetCode简单题之爬楼梯

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

  3. 【LeetCode笔记】70. 爬楼梯(Java、动态规划)

    文章目录 题目描述 代码 & 思路 1. 动态规划 O(n).O(n) 2. 动态规划 O(n).O(1) 题目描述 DP 入门题了属于是 代码 & 思路 1. 动态规划 O(n).O ...

  4. 小黑静待身边朋友的考研佳音,明天准备面试,在白塔咖啡帐篷里的一下午的leetcode之旅:70. 爬楼梯

    小黑代码:记忆化搜索 class Solution:def climbStairs(self, n: int) -> int:# 记忆字典map_ = {}# 递归搜索函数def dfs(res ...

  5. LeetCode刷题遇到的小知识点总结

    文章目录 1. 需要判断输入的两个参数的大小/长度 2. 数学分式的化简 3. 二叉树操作的小总结 4. MySQL分组内取前几名的问题 5. SQL中的小问题 6. 对哈希表的初步理解 (1)初步理 ...

  6. ​LeetCode刷题实战70:爬楼梯

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

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

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

  8. leetcode - 70. 爬楼梯

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

  9. Python描述 LeetCode 70. 爬楼梯

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

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

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

最新文章

  1. 打破“维度的诅咒”,机器学习降维大法好
  2. 中国信通院:2019年Q1全球人工智能产业数据报告
  3. java文件流读取异常_Java IO流的FileInputStream读取文件的问题,不同写法输出不一样...
  4. 架构师速成4.6-软技能和硬技能
  5. 作者:王文生,中国农业科学院农业信息研究所副所长、研究员。
  6. pku1189 钉子和小球
  7. MongoDB的存储结构及对空间使用率的影响
  8. 基于强化学习的关系抽取和文本分类
  9. steam游戏图标失效_如何将非Steam游戏添加到Steam并应用自定义图标
  10. js几种常见的设计模式
  11. 一次惨痛的微软AA面经历
  12. DDR SDRAM内存发展历程
  13. 中学-综合素质【1】
  14. windows2003通过iis配置ftp服务器
  15. “创宇ADS”获公安部颁发《计算机信息系统安全专用产品销售许可证》!
  16. 计算机ps课如何把玫瑰花绿色,ps变色教程 利用PhotoShop将红玫瑰变成蓝色玫瑰
  17. web服务器—nginx
  18. 申请ssl 验证域名 失败了 中间证书
  19. python数字和字符串可以运算吗_python数字和字符串对象
  20. 3D空间中射线与三角形的交叉检测算法【转】

热门文章

  1. 【服务器代理跨域】---测试网络上一些接口是否可以被调用
  2. 理解URL以及如何区分相对URL和绝对URL
  3. Mysql缺少可执行的命令
  4. LINUX下查看CPU使用率的命令[Z]
  5. 41.django中auth用户认证
  6. form resetFields并没有清空表单
  7. Java Memcached的使用
  8. MongoDB DBA 实践2-----MongoDB CRUD操作
  9. Package.json 属性说明
  10. editplus更改编码