鱼C论坛

 找回密码
 立即注册
查看: 70|回复: 2

递归题代码如何修改

[复制链接]
发表于 2024-11-5 17:13:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
322. 零钱兑换
中等
相关标签
相关企业
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。
题目描述如上,代码如下
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        res = float('inf') #比较数组长度,存放最小的
        ans = [] #存放每个满足条件的数组
        def dfs(coins,target):
            
            for coin in coins:        
                    ans.append(coin)
                    target -= coin
                    if target == 0: 
                        res = min(res,len(ans))
                    elif target < 0: 
                        return
                    else:
                        dfs(coins,target)
            return res
        dfs(coins,amount)
                
怎么修改代码以使target为负时返回上一层级节点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-5 17:13:52 | 显示全部楼层
你可以通过在递归函数中加入回溯的步骤来解决这个问题。当 `target` 为负时,需要从当前层级返回,同时将之前尝试加入 `ans` 的硬币再移除掉。

以下是修改后的代码:
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        self.res = float('inf')  # 使用实例变量来存储全局最小值
        ans = []  # 存放每个满足条件的数组

        def dfs(target):
            # 当 target 为负数时,直接返回
            if target < 0:
                return

            # 当 target 为零时,更新最小硬币数量
            if target == 0:
                self.res = min(self.res, len(ans))
                return

            for coin in coins:
                ans.append(coin)  # 选中一个硬币
                dfs(target - coin)  # 继续递归搜索
                ans.pop()  # 回溯:移除最后一个硬币,返回上一层级

        dfs(amount)
        
        # 如果 res 没有被更新,返回 -1
        return self.res if self.res != float('inf') else -1

这里的关键是加入了 `ans.pop()`,这一步用于在递归返回时移除上一次选中的硬币,以确保在新的递归路径中可以尝试不同的组合。这种回溯的手法可以有效避免重复和不必要的计算。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-5 20:05:29 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-5 20:23 编辑

        试试这个代码
class Solution:
    def coinChange(self , coins: list[int] , amount: int) -> int:
        coins . sort(reverse = True)
        e , i , r = [0 for _ in range(len(coins))] , 0 , amount
        while r > 0 and i < len(coins) :
            if r >= coins[i] :
                e[i] , r = r // coins[i] , r % coins[i]
            i += 1
        return sum(e) if not r else -1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表