力扣-322 零钱兑换

这篇博客探讨了如何使用动态规划算法解决硬币找零问题。作者提供了三种不同的实现方式,包括基本的动态规划、优化后的动态规划以及利用缓存避免重复计算的版本。每个实现都通过递归函数来寻找最小硬币组合数。博客强调了动态规划在解决此类问题中的效率和优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

'''
自己的想法,超时
'''
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        # 动态规划
        dp = [1 for i in range(len(coins))]

        # 最简单的状态
        # if amount == 0:
        #     return 0

        # dp[amount] = num
        # 对于每次减去一个金额,会使得数量发生变化
        # 定义dp数组,给定一个金额amount,得到一个数量
        def find(coins, amount):
            if amount == 0:
                return 0
            min_v = float('inf')
            for i in range(len(coins)):
                target = amount-coins[i]
                if target < 0:
                    continue
                num = find(coins, target)+1
                if num < min_v:
                    min_v = num
            return min_v
        res = find(coins, amount)
        return res if res!=float('inf') else -1
#  优化,记录重复步骤
class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        # 动态规划
        dp = {}
        def find(coins, amount):
            if amount == 0:
                return 0
            min_v = float('inf')
            for i in range(len(coins)):
                target = amount-coins[i]
                if target < 0:
                    continue
                if target in dp:
                    num = dp[target] + 1
                else:
                    num = find(coins, target)+1
                if num < min_v:
                    min_v = num
            if amount not in dp:
                dp[amount] = min_v
            return min_v
        res = find(coins, amount)
        return res if res!=float('inf') else -1

参考自labuladong的算法小抄

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        # 动态规划
        helper = {}
        def dp(n):
            if n in helper:
                return helper[n]
            if n == 0:
                return 0
            if n <= 0:
                return -1
            res = float('inf')
            for i in coins:
                target = dp(n-i)
                if target == -1:
                    continue
                res = min(res, target+1)
            # if res not in helper:
            helper[n] = res
            return res

        r = dp(amount)
        return r if r!=float('inf') else -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值