LeetCode 322. 零钱兑换(Medium)/ 零钱兑换2(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

零钱兑换2

在这里插入图片描述

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
    	# dp[i]表示可凑成总金额i的组合数量
        dp = [0] * (amount + 1)
        dp[0] = 1
        # 遍历每一种硬币(遍历物品)
        for i in range(len(coins)):
            # 遍历每一种总额(遍历背包) 
            for j in range(coins[i], amount + 1):
                dp[j] += dp[j - coins[i]]
        return dp[amount]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:DFS是深度优先搜索的缩写,它是一种图遍历算法。DFS的实现可以使用栈来模拟,代码和BFS基本相同,只需要将BFS中的队列改为栈,将pop(0)改为pop()即可。下面是一个使用DFS实现的Python代码示例: ```python def DFS(graph, s): stack = \[\] # 用栈来实现DFS stack.append(s) # 将起始点加入栈中 seen = \[\] # 用来保存已经访问过的节点 seen.append(s) while len(stack) > 0: vertex = stack.pop() # 弹出栈顶元素 nodes = graph\[vertex\] for node in nodes: if node not in seen: stack.append(node) seen.append(node) print(vertex) # 打印当前访问的节点 graph = { "A": \["B", "C"\], "B": \["A", "C", "D"\], "C": \["A", "B", "D", "E"\], "D": \["B", "C", "E", "F"\], "E": \["C", "D"\], "F": \["D"\] } DFS(graph, "A") ``` 引用\[2\]:DFS是深度优先搜索的缩写,它是一种图遍历算法。DFS的实现可以使用栈来模拟,代码和BFS基本相同,只需要将BFS中的队列改为栈,将pop(0)改为pop()即可。下面是一个使用DFS实现的Python代码示例: ```python def DFS(graph, s): stack = \[\] # 用栈来实现DFS stack.append(s) # 将起始点加入栈中 seen = \[\] # 用来保存已经访问过的节点 seen.append(s) while len(stack) > 0: vertex = stack.pop() # 弹出栈顶元素 nodes = graph\[vertex\] for node in nodes: if node not in seen: stack.append(node) seen.append(node) print(vertex) # 打印当前访问的节点 graph = { "A": \["B", "C"\], "B": \["A", "C", "D"\], "C": \["A", "B", "D", "E"\], "D": \["B", "C", "E", "F"\], "E": \["C", "D"\], "F": \["D"\] } DFS(graph, "A") ``` 综上所述,以上是两个使用DFS实现的Python代码示例。它们的原理是通过栈来模拟深度优先搜索,从起始点开始,一直沿着一条路径走到底,直到无路可走再回溯。在遍历过程中,使用一个列表来保存已经访问过的节点,以避免重复访问。 #### 引用[.reference_title] - *1* *2* *3* [Python BFS和DFS算法](https://blog.csdn.net/qq_43540763/article/details/115144191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值