首页 > 编程语言 >代码随想录算法训练营第三十八天|leetcode322. 零钱兑换、leetcode279.完全平方数、leetcode139.单词拆分

代码随想录算法训练营第三十八天|leetcode322. 零钱兑换、leetcode279.完全平方数、leetcode139.单词拆分

时间:2024-12-04 12:44:44浏览次数:9  
标签:leetcode279 return int coins 随想录 amount range 第三十八 dp

1 leetcode322. 零钱兑换

题目链接:322. 零钱兑换 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili

思路:感觉跟之前的方法思路差不多,就是对dp初始化的时候,我开始弄错了,应该初始成无限大,对dp[0]初始成0才是对的,就是这个地方搞错了,然后还有就是上去判断值的大小,这里当时以为(1+2+5)>11,哈哈哈哈哈哈哈,被自己逗笑了

1.1 自己的方法

就是判断语句的时候卡了一下,不过整体而言还比较好吧

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')]*(amount+1)
        dp[0] = 0
        for i in range(amount+1):
            for j in range(len(coins)):
                if i-coins[j]>=0:
                    dp[i] = min(dp[i],dp[i-coins[j]]+1)
        if dp[amount]==float('inf'):
            return -1
        return dp[amount] 

1.2 先物品后背包

其实也差不多吧,就是顺序遍历的一个区别,为什么两者都可以,是因为在这道题目中没有顺序的要求,所以先遍历哪个并不是这么重要

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')]*(amount+1)
        dp[0] = 0
        for i in range(len(coins)):
            for j in range(coins[i],amount+1):
                dp[j] = min(dp[j],dp[j-coins[i]]+1)
        if dp[amount]==float('inf'):
            return -1
        return dp[amount] 

1.3 本题小结

  1. 这道题目其实主要就是对dp的初始化,才开始比较容易弄错吧,就是初始化的结果不是我想要的那种,不过递推公式我算是想对啦
  2. 希望可以继续加油,学会这些题目吧

2 leetcode279.完全平方数

题目链接:279. 完全平方数 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili

思路:跟上一题几乎一模一样吧,就是觉得可能还是有可以优化的地方,我还没优化,导致这道题目计算时间比较长吧

2.1 自己的方法

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')]*(n+1)
        dp[0] = 0
        for i in range(1,n+1):
            for j in range(1,n+1):
                if j>100:
                    break
                if i-j**2>=0:
                    dp[i] = min(dp[i],dp[i-j**2]+1)
        return dp[n]

2.2 视频后的思路

主要其实和我的代码差不多,就是优化的地方吧

2.2.1 先背包后物品
class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')]*(n+1)
        dp[0] = 0
        for i in range(1,n+1):
            for j in range(1,int(i**0.5)+1):
                dp[i] = min(dp[i],dp[i-j**2]+1)
        return dp[n]
2.2.2 先物品后背包
class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')]*(n+1)
        dp[0] = 0
        for i in range(1,int(n**0.5)+1):
            for j in range(i**2,n+1):
                dp[j] = min(dp[j],dp[j-i**2]+1)
        return dp[n]

2.3 本题小结

  1. 这道题目其实跟上一题差不多,区别就是中间的一小点吧,最后的位置位于哪里的一个差距,确实可以优化呀,这里
  2. 我的优化方法还需要进一步提高呀

3 leetcode139.单词拆分

题目链接:139. 单词拆分 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili

思路:就是说,不会,听不懂的一题

3.1 视频后的讲解

啊啊啊啊啊,这道题,属实有点不理解,只有在打印的时候去看,我才明白为什么

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [False]*(len(s)+1)
        dp[0] =True
        for i in range(1,len(s)+1):
            for j in range(i):
                if dp[j] and s[j:i] in wordDict:
                    dp[i] =True
                    break
        return dp[-1]

3.2 本题小结

  1. 这道题目,属实有点不理解,但是我知道上去是先遍历背包,再遍历物品的,因为他的值其实是有顺序的向里面放数据的
  2. 难呀,希望我可以慢慢掌握吧

4 今日小结

  1. 就是说,前两题还好,第三题的递推公式属实把我整懵了
  2. 整体而言,算是对之前的知识的巩固吧,继续加油

标签:leetcode279,return,int,coins,随想录,amount,range,第三十八,dp
From: https://www.cnblogs.com/csfy0524/p/18586014

相关文章

  • 代码随想录算法训练营第三十六天|LeetCode1049.最后一块石头的重量II、LeetCode494.目
    前言打卡代码随想录算法训练营第49期第三十六天...φ(0 ̄*)啦啦啦_φ(* ̄0 ̄)′首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。Le......
  • 【代码随想录】刷题记录(55)-从中序与后序遍历序列构造二叉树
    题目描述:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例1: 输入:inorder=[9,3,15,20,7],postorder=[9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例2:......
  • 代码随想录-数组2
    977.有序数组的平方力扣题目链接基本思路暴力解法,先全部平方,然后排序双指针法,由于原本数组是有序的,从负数到正数,平方之后最大数只会出现在两端的位置。考虑设置一个新数组存放排序后的元素,利用相向指针判断选择要把哪个元素先放入新数组。暴力排序classSolution{pu......
  • 代码随想录算法训练营第三十一天|leetcode56. 合并区间、leetcode738.单调递增的数字
    1leetcode56.合并区间题目链接:56.合并区间-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法,合并区间有细节!LeetCode:56.合并区间哔哩哔哩bilibili思路:其实很清楚,跟之前的方法差不多,但是自己写的时候就是有地方不会了,会不知道接下来的思路是什么1.1视频后的思路卡壳......
  • 代码随想录算法训练营第十四天 | 226.翻转二叉树、 101. 对称二叉树、104.二叉树的最
    文档讲解:代码随想录视频讲解:代码随想录状态:完成4道题226.翻转二叉树整体思路:交换每一个节点的左右孩子思考:使用哪种遍历方式?建议使用前序或后序遍历(中序遍历比较绕)​前序遍历#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,va......
  • 代码随想录算法训练营第三十二天|leetcode509. 斐波那契数、leetcode70. 爬楼梯、leet
    1动态规划五部曲文章链接:代码随想录视频链接:从此再也不怕动态规划了,动态规划解题方法论大曝光!|理论基础|力扣刷题总结|动态规划入门_哔哩哔哩_bilibili确定dp数组(dptable)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组2leetcode509.斐......
  • 代码随想录第十一天|栈与队列part02--150.逆波兰表达式求值、239.滑动窗口最大值、347
    150.逆波兰表达式求值(150.逆波兰表达式求值)题目分析:计算逆波兰表达式(后缀表达式:左右中)的值,算符仅包含四则运算,操作数为一个整数或另一个表达式,整数除法向零截断(向下取整),无除零运算,答案及中间结果不超过32位,即使用整型int即可。解题重点:后缀表达式的每一个表达式中:读入1个算......
  • 代码随想录算法训练营第三十一天|leetcode56. 合并区间、leetcode738.单调递增的数字
    1leetcode56.合并区间题目链接:56.合并区间-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili思路:其实很清楚,跟之前的方法差不多,但是自己写的时候就是有地方不会了,会不知道接下来的思路是什么1.1视频后的思路卡壳......
  • 第三十八讲:自增主键为什么不是连续的
    第三十八讲:自增主键为什么不是连续的简概引言​ 在第4篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。​ 之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计假设自增主键是连续的。​ 但实际上,这......
  • 代码随想录算法训练营day61| 卡码网97.小明逛公园 127.骑士的攻击
    学习资料:https://www.programmercarl.com/kamacoder/0097.小明逛公园.htmlfloyd算法,三维矩阵A*算法学习记录:97.小明逛公园(没看懂,抄的)点击查看代码#三维数组Floydif__name__=="__main__":max_int=10005n,m=map(int,input().split())grid=[[[max_......