LeetCode 322. 零钱兑换(Medium)

在这里插入图片描述
题目链接

题解

  1. 零钱兑换

思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

class Solution:
    ### 0124 递归(1104 ms,50.2 MB)
    def coinChange(self, coins: List[int], amount: int) -> int:
        # 注意:需要增加lru_cache装饰器,实现记忆化缓存
        @functools.lru_cache(amount)
        def dfs(remain):
            if remain < 0: return -1
            elif remain == 0: return 0

            # 每次初始化所需的最少硬币数为硬币最大数量
            mini = int(1e9)

            for coin in coins:
                res = dfs(remain - coin)
                # 只有当去掉当前coin时的最小硬币数
                # 比不去掉当前coin时所需要的硬币更少,才更新mini
                if 0 <= res < mini:
                    mini = res + 1
            
            return mini if mini < int(1e9) else -1

        if amount == 0: return 0
        return dfs(amount)

    ### 0124 递归(1144 ms,15.2 MB)
    def coinChange(self, coins: List[int], amount: int) -> int:
        # dp[i]表示总额为i时所需的最少硬币数量
        # 且初始化总额为0时所需硬币也为0
        dp = [float('+inf')] * (amount + 1)
        dp[0] = 0

        # 遍历每一种硬币
        for coin in coins:
            # 遍历每一种总额
            for i in range(coin, amount + 1):
                dp[i] = min(dp[i], dp[i - coin] + 1)
            
        return dp[amount] if dp[amount] != float('+inf') else -1
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页