《算法通关之路》-chapter9动态规划

这篇具有很好参考价值的文章主要介绍了《算法通关之路》-chapter9动态规划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

《算法通关之路》学习笔记,记录一下自己的刷题过程,详细的内容请大家购买作者的书籍查阅。

爬楼梯

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

'''
方法二:动态规划
时间复杂度:O(n)
空间复杂度:O(n)
'''
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]
    
n = 2
solu = Solution()
solu.climbStairs(n)
'''
方法二:动态规划(优化空间)
时间复杂度:O(n)
空间复杂度:O(1)
'''
class Solution:
    def climbStairs(self, n: int) -> int:
        if n < 2:
            return n
        fir, sec = 1, 2
        for i in range(3, n + 1):
            fir, sec = sec, fir + sec
        return sec

n = 3
solu = Solution()
solu.climbStairs(n)

打家劫舍

力扣第198题
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

'''
方法一:递归(超时)
时间复杂度:O(2^n)
空间复杂度:O(n)
'''
class Solution:
    def rob(self, nums: list[int]) -> int:
        if len(nums) == 0:
            return 0
        return max(self.rob(nums[1:]), nums[0] + self.rob(nums[2:]))

nums = [1,2,3,1]
solu = Solution()
solu.rob(nums)
'''
方法二:递记忆化递归
时间复杂度:O(n)
空间复杂度:O(n)
'''
class Solution:
    def rob(self, nums: list[int]) -> int:
        memo = [-1] * (len(nums) + 1)
        memo[-1] = 0

        def helper(n: int, nums: list[int], memo: list[int]) -> int:
            if n >= len(nums):
                return 0
            if memo[n] != -1:
                return memo[n]
            memo[n] = max(helper(n+1, nums, memo), nums[n] + helper(n+2, nums, memo))
            return memo[n]
        
        return helper(0, nums, memo)

nums = [1,2,3,1]
solu = Solution()
solu.rob(nums)
'''
方法三:动态规划
时间复杂度:O(n)
空间复杂度:O(n)
'''
class Solution:
    def rob(self, nums: list[int]) -> int:
        n = len(nums)
        dp = [0] * (n+2)
        for i in range(0, len(nums)):
            dp[i+2] = max(dp[i] + nums[i], dp[i+1])
        return dp[n+1]

nums = [1,2,3,1]
solu = Solution()
solu.rob(nums)
'''
方法四:动态规划(优化空间)
时间复杂度:O(n)
空间复杂度:O(1)
'''
class Solution:
    def rob(self, nums: list[int]) -> int:
        curr, prev = 0, 0
        for i in range(0, len(nums)):
            prev, curr = curr, max(prev + nums[i], curr)
        return curr

nums = [1,2,3,1]
solu = Solution()
solu.rob(nums)

打家劫舍 II

力扣第213题
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

'''
方法四:动态规划(优化空间)
时间复杂度:O(n)
空间复杂度:O(1)
'''
class Solution:
    def rob(self, nums: list[int]) -> int:
        if len(nums) == 1:
            return nums[0]
            
        def the_most_cash(nums): # 打家劫舍中的dp
            curr, prev = 0, 0
            for i in range(0, len(nums)):
                prev, curr = curr, max(prev + nums[i], curr)
            return curr
        
        return max(the_most_cash(nums[1:]), the_most_cash(nums[:-1]))

nums = [2,3,2]
solu = Solution()
solu.rob(nums)

不同路径

力扣第62题
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

'''
方法一:记忆化递归(超时)
时间复杂度:O(mn)
空间复杂度:O(mn)
'''
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        visited = dict()
        if m == 1 or n == 1:
            return 1
        if (m, n) in visited:
            return visited[(m, n)]
        cnt = self.uniquePaths(m, n-1) + self.uniquePaths(m-1, n)
        visited[(m, n)] = cnt
        return cnt

m, n = 3, 7
solu = Solution()
solu.uniquePaths(m, n)
'''
方法二:动态规划
时间复杂度:O(mn)
空间复杂度:O(mn)
'''
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[1] * n for _ in range(m)]
        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[m-1][n-1]

m, n = 3, 7
solu = Solution()
solu.uniquePaths(m, n)
'''
方法三:动态规划(滚动数组)
时间复杂度:O(mn)
空间复杂度:O(n)
'''
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [1] * n
        for i in range(1, m):
            for j in range(1, n):
                dp[j] += dp[j-1]
        return dp[n-1]

m, n = 3, 7
solu = Solution()
solu.uniquePaths(m, n)

零钱兑换

力扣第322题
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。

'''
方法一:动态规划
时间复杂度:O(mn)
空间复杂度:O(n)
'''
class Solution:
    def coinChange(self, coins: list[int], amount: int) -> int:
        if amount == 0:
            return 0
        dp = [amount+1] * (amount+1)
        dp[0] = 0
        for i in range(1, amount+1):
            for coin in coins:
                if coin <= i:
                    dp[i] = min(dp[i], dp[i-coin]+1)
        return -1 if dp[amount] == amount + 1 else dp[amount]

coins, amount = [1, 2, 5], 11
solu = Solution()
solu.coinChange(coins, amount)

零钱兑换 II

力扣第518题
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。

'''
方法一:动态规划
时间复杂度:O(mn)
空间复杂度:O(n)
'''
class Solution:
    def change(self, amount: int, coins: list[int]) -> int:
        dp = [0] * (amount+1)
        dp[0] = 1
        for coin in coins:
            for i in range(coin, amount+1):
                if coin <= i:
                    dp[i] += dp[i-coin]
        return dp[amount]

amount, coins = 5, [1, 2, 5]
solu = Solution()
solu.change(amount, coins)

笔记本-Github文章来源地址https://www.toymoban.com/news/detail-471326.html

到了这里,关于《算法通关之路》-chapter9动态规划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【leetcode刷题之路】剑指Offer(4)——分治+排序算法+动态规划

    8 分治算法 8.1 【递归】剑指 Offer 07 - 重建二叉树 https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/   前序遍历是根左右,中序遍历是左根右,这也就意味着前序遍历的第一个节点是整棵树的根节点,顺着这个节点找到它在中序遍历中的位置,即为in_root,那么in_root左边的都在左子

    2024年02月11日
    浏览(59)
  • 算法50:动态规划专练(力扣514题:自由之路-----4种写法)

    题目: 力扣514 : 自由之路  . - 力扣(LeetCode) 题目的详细描述,直接打开力扣看就是了,下面说一下我对题目的理解: 事例1: 1. ring的第一个字符默认是指向12点方向的,这一点很重要 2. key的第一个字符为g,而ring中首字符和末尾字符都为g。因此,必然存在选择首字符的g还

    2024年04月15日
    浏览(30)
  • 【leetcode刷题之路】初级算法(2)——链表+树+排序和搜索+动态规划

    3.1 【链表】删除链表中的节点 https://leetcode.cn/problems/delete-node-in-a-linked-list/ 给出的就是要删除的那个节点,直接前后移动就行了。 3.2 【双指针】删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 利用双指针left和right,首先让right遍历n个节点,再让两

    2024年02月10日
    浏览(51)
  • Apollo决策规划算法学习Chapter3 速度规划算法

    第一章 Apollo决策规划算法基本概念 第二章 Apollo决策规划之路径规划算法 第三章 Apollo决策规划之速度规划算法 本文为第三章,主要讲解 Apollo决策规划算法中的速度规划算法,EM planner的速度规划算法同样是是通过动态规划和二次规划实现的,下面来细讲速度规划算法。 1)回

    2024年02月11日
    浏览(61)
  • 【Leetcode 514】自由之路 —— 动态规划

    电子游戏“辐射4”中,任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘,并使用表盘拼写特定才能开门。 给定一个字符串 ring ,表示刻在外环上的编码;给定另一个字符串 key ,表示需要拼写的。您需要算出能够拼写中所有字符的最

    2024年02月19日
    浏览(33)
  • 动态规划02 自由之路[C++]

       图源:文心一言 leedcode每日一题,提供了常规解法及其详细解释,供小伙伴们参考~🥝🥝 第1版:在力扣新手村刷题的记录~🧩🧩 方法一:递归调用,可以运行,但是不能通过较长的测试用例 失败 ~ 方法二:动态规划,普遍适用的方法~ 编辑: 梅头脑🌸 审核: 文心一言

    2024年02月22日
    浏览(40)
  • 数学建模基础算法Chapter2.1 -- 整数规划(ILP): 分支定界+割平面

    By 进栈需检票 当题目要求的最优解是整数,例如物件的数量,参与人员的数量等时,就不能继续使用之前的线性规划了(当出现小数的情况),这个时候需考虑整数规划这样的一种建模形式 但是目前所流行的求整数规划的方法,只适用于整数线性规划,不能解决一切的整数

    2024年02月12日
    浏览(54)
  • 【leetcode刷题之路】面试经典150题(8)——位运算+数学+一维动态规划+多维动态规划

    20 位运算 20.1 【位运算】二进制求和 题目地址:https://leetcode.cn/problems/add-binary/description/?envType=study-plan-v2envId=top-interview-150   按位逆序运算。 20.2 【位运算】颠倒二进制位 题目地址:https://leetcode.cn/problems/reverse-bits/description/?envType=study-plan-v2envId=top-interview-150   详见代码

    2024年04月16日
    浏览(75)
  • 【算法】动态规划 ⑧ ( 动态规划特点 )

    求解类型 : 动态规划 必须是求 最值 , 可行性 , 方案数 , 三者之一 , 如果求其它内容 , 则不能使用动态规划算法 ; 求最值 : 最大值 , 最小值 等 ; 大规模问题的结果 由 小规模问题 的计算结果 取最大值 大规模问题的结果 由 小规模问题 的计算结果 取最小值 可行性 : 是否可行

    2023年04月08日
    浏览(48)
  • 【算法 - 动态规划】原来写出动态规划如此简单!

    从本篇开始,我们就正式开始进入 动态规划 系列文章的学习。 本文先来练习两道通过 建立缓存表 优化解题过程的题目,对如何将 递归函数 修改成 动态规划 的流程有个基本的熟悉。 用最简单的想法完成题目要求的 递归 函数; 定义明确 递归函数 的功能!!! 分析是否存

    2024年02月21日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包