[Leetcode] [Tutorial] 动态规划

文章目录

  • [70. 爬楼梯](#70. 爬楼梯)

70. 爬楼梯

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

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

示例:

输入:n = 3

输出:3

Solution

我们先通过直观的方式思考问题:对于给定的阶梯数n,每次爬1阶或2阶,因此有两种选择,可以分解为以下子问题:

  • 爬上n-1阶,再爬1阶
  • 爬上n-2阶,再爬2阶

所以解就是上述两个子问题的和。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        if n == 1:
            return 1
        if n == 2:
            return 2
        return self.climbStairs(n - 1) + self.climbStairs(n - 2)

上述直接递归的缺点在于重复计算,那么我们可以保存已经计算的子问题的结果。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        memo = [0] * (n + 1)
        return self.climb_with_memoization(n, memo)

    def climb_with_memoization(self, n: int, memo: list) -> int:
        if n == 1:
            return 1
        if n == 2:
            return 2
        if memo[n] > 0:
            return memo[n]
        memo[n] = self.climb_with_memoization(n - 1, memo) + self.climb_with_memoization(n - 2, memo)
        return memo[n]

记忆化递归依然使用了递归结构,而递归结构可以转换为迭代结构。我们可以从底部开始计算,逐步构建解,直到达到n。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n
        dp = [0] * (n + 1)
        dp[1], dp[2] = 1, 2
        for i in range(3, n + 1):
            dp[i] = dp[i - 1] + dp[i - 2]
        return dp[n]

观察上述代码,我们发现每次计算只使用了前两个状态的值。因此,完全没有必要保存所有的值,只需保存最后两个状态。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n
        a, b = 1, 2
        for _ in range(3, n + 1):
            a, b = b, a + b
        return b
相关推荐
Ratten10 分钟前
批量识别图片文字保存到 excel 中
python
WSSWWWSSW30 分钟前
Seaborn数据可视化实战:Seaborn多变量图表绘制高级教程
python·信息可视化·数据分析·matplotlib·seaborn
Keying,,,,1 小时前
力扣hot100 | 图论 | 200. 岛屿数量、994. 腐烂的橘子、207. 课程表、208. 实现 Trie (前缀树)
算法·leetcode·图论
ShawnLeiLei1 小时前
2.3 Flink的核心概念解析
数据库·python·flink
-Xie-1 小时前
Maven(三)
python·pycharm·maven
WSSWWWSSW1 小时前
Seaborn数据可视化实战:Seaborn颜色与样式定制教程
python·信息可视化·seaborn
Boxsc_midnight2 小时前
【适合中小企业应用的Flask网站部署指南】【小白指南系列】如何在Windows Server服务器上部署Flask网站和SSL证书开启HTTPS
服务器·windows·python·flask
楼田莉子3 小时前
C++算法学习专题:滑动窗口
开发语言·数据结构·c++·学习·算法·leetcode
码界筑梦坊3 小时前
173-基于Flask的微博舆情数据分析系统
后端·python·数据分析·flask·毕业设计
nightunderblackcat4 小时前
新手向:异步编程入门asyncio最佳实践
前端·数据库·python