1 leetcode322. 零钱兑换
文章链接:代码随想录
视频链接:动态规划之完全背包,装满背包最少的物品件数是多少?| 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 本题小结
- 这道题目其实主要就是对dp的初始化,才开始比较容易弄错吧,就是初始化的结果不是我想要的那种,不过递推公式我算是想对啦
- 希望可以继续加油,学会这些题目吧
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 本题小结
- 这道题目其实跟上一题差不多,区别就是中间的一小点吧,最后的位置位于哪里的一个差距,确实可以优化呀,这里
- 我的优化方法还需要进一步提高呀
3 leetcode139.单词拆分
文章链接:代码随想录
视频链接:动态规划之完全背包,你的背包如何装满?| 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 本题小结
- 这道题目,属实有点不理解,但是我知道上去是先遍历背包,再遍历物品的,因为他的值其实是有顺序的向里面放数据的
- 难呀,希望我可以慢慢掌握吧
4 今日小结
- 就是说,前两题还好,第三题的递推公式属实把我整懵了
- 整体而言,算是对之前的知识的巩固吧,继续加油