当前位置:   article > 正文

算法随想录第四十五天打卡|70. 爬楼梯 (进阶),322. 零钱兑换 , 279.完全平方数

算法随想录第四十五天打卡|70. 爬楼梯 (进阶),322. 零钱兑换 , 279.完全平方数

70. 爬楼梯 (进阶)

这道题目 爬楼梯之前我们做过,这次再用完全背包的思路来分析一遍 

代码随想录

  1. def stairway(self,n,m):
  2. dp=[0]*(n+1)
  3. dp[0]=1
  4. for j in range(1,n+1): #表示背包
  5. for num in range(m): #表示物品
  6. if j>=num:
  7. dp[j]+=dp[j-num]
  8. return dp[n]

总结

不太会用卡码网,不过跟组合的那道题是一样的,就用组合的模板来写了。

322. 零钱兑换  

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环

遍历物品。

这句话结合本题 大家要好好理解。

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

代码随想录

思路

这道题要改的是dp的定义和方程式。

  1. class Solution(object):
  2. def coinChange(self, coins, amount):
  3. dp=[float('inf')]*(amount+1) #表示i背包的容量所需要的最小的硬币个数
  4. dp[0]=0
  5. for coin in coins:
  6. for j in range(coin,amount+1):
  7. dp[j]=min(dp[j],dp[j-coin]+1)
  8. return dp[amount] if dp[amount]!=float('inf') else -1

总结

开始还用的0作为初始量,结果都是零。

 279.完全平方数  

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做 

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

代码随想录

  1. class Solution(object):
  2. def numSquares(self, n):
  3. dp=[float('inf')]*(n+1)
  4. dp[0]=0
  5. i=1 #i代表的是小于n的最大平方数
  6. while True:
  7. if (i+1)**2==n:
  8. return 1
  9. elif (i+1)**2>n:
  10. break
  11. else:
  12. i+=1
  13. for _ in range(1,i+1):
  14. num=_**2 #代表的是物品
  15. for j in range(num,n+1):
  16. dp[j]=min(dp[j],dp[j-num]+1)
  17. return dp[n]
答案
  1. class Solution:
  2. def numSquares(self, n: int) -> int:
  3. dp = [float('inf')] * (n + 1)
  4. dp[0] = 0
  5. for i in range(1, n + 1): # 遍历背包
  6. for j in range(1, int(i ** 0.5) + 1): # 遍历物品
  7. # 更新凑成数字 i 所需的最少完全平方数数量
  8. dp[i] = min(dp[i], dp[i - j * j] + 1)
  9. return dp[n]

总结

确实是基本一样,但是感觉优化空间很大,我用了2000毫秒,但最快的是40毫秒。感觉答案的优化做的太好了,我觉得可以优化的地方都有优化,但是为啥它花的时间还更长了呢?

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52981
推荐阅读
相关标签
  

闽ICP备14008679号