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

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. 整体而言,算是对之前的知识的巩固吧,继续加油
posted @   小方呀0524  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示