[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
相关推荐
shizidushu5 分钟前
使用 Pyinstaller 打包 PPOCRLabel
python·pyinstaller
Q_Q196328847538 分钟前
python+springboot+uniapp微信小程序题库系统 在线答题 题目分类 错题本管理 学习记录查询系统
spring boot·python·django·uni-app·node.js·php
共享家95271 小时前
经典动态规划题解
算法·leetcode·动态规划
Rhys..1 小时前
.gitignore文件的作用及用法
python·github
IT学长编程1 小时前
计算机毕业设计 基于深度学习的酒店评论文本情感分析研究 Python毕业设计项目 Hadoop毕业设计选题 机器学习选题【附源码+文档报告+安装调试】
hadoop·python·深度学习·机器学习·数据分析·毕业设计·酒店评论文本情感分析
~-~%%2 小时前
Moe机制与pytorch实现
人工智能·pytorch·python
深耕AI2 小时前
【PyTorch训练】为什么要有 loss.backward() 和 optimizer.step()?
人工智能·pytorch·python
1白天的黑夜12 小时前
栈-844.比较含退格的字符串-力扣(LeetCode)
c++·leetcode·
0_0梅伊阁诗人3 小时前
Django ORM 模型
开发语言·数据库·笔记·python·oracle·django
Genevieve_xiao3 小时前
【dl】python基础 深度学习中需要用到的python基础
python·深度学习