ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/13 14:40:11 拓冰建站 浏览量
算法随想录第四十五天打卡|70. 爬楼梯 (进阶),322. 零钱兑换 , 279.完全平方数

70. 爬楼梯 (进阶)

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

代码随想录

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

总结

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

322. 零钱兑换  

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

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

遍历物品。

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

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

代码随想录

思路

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

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

总结

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

 279.完全平方数  

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

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

代码随想录

class Solution(object):def numSquares(self, n):dp=[float('inf')]*(n+1)dp[0]=0i=1  #i代表的是小于n的最大平方数while True:if (i+1)**2==n:return 1elif (i+1)**2>n:breakelse:i+=1for _ in range(1,i+1): num=_**2 #代表的是物品for j in range(num,n+1):dp[j]=min(dp[j],dp[j-num]+1)return dp[n]
答案
class Solution:def numSquares(self, n: int) -> int:dp = [float('inf')] * (n + 1)dp[0] = 0for i in range(1, n + 1):  # 遍历背包for j in range(1, int(i ** 0.5) + 1):  # 遍历物品# 更新凑成数字 i 所需的最少完全平方数数量dp[i] = min(dp[i], dp[i - j * j] + 1)return dp[n]

总结

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