首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在硬币兑换类型的问题中将递归函数重构为迭代函数

在硬币兑换类型的问题中,将递归函数重构为迭代函数是为了提高算法的效率和性能。递归函数在处理大规模问题时可能会导致栈溢出或者重复计算的问题,而迭代函数则可以通过循环的方式一步步地解决问题,避免了这些潜在的问题。

硬币兑换类型的问题是指给定一定面额的硬币和一个目标金额,求出组合硬币的方式使得总金额等于目标金额。例如,给定硬币面额为[1, 2, 5],目标金额为11,可以通过组合硬币的方式得到11元,其中一种方式是使用5元硬币2枚、2元硬币3枚和1元硬币1枚。

下面是将递归函数重构为迭代函数的示例代码:

代码语言:txt
复制
def coinChange(coins, amount):
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0

    for i in range(1, amount + 1):
        for coin in coins:
            if i >= coin:
                dp[i] = min(dp[i], dp[i - coin] + 1)

    return dp[amount] if dp[amount] != float('inf') else -1

在上述代码中,我们使用了一个动态规划的思想来解决硬币兑换类型的问题。首先创建一个长度为目标金额加1的列表dp,用来保存每个金额对应的最小硬币数量。将dp列表初始化为正无穷大,表示初始状态下无法凑出目标金额。然后将dp[0]初始化为0,表示凑出金额为0时不需要任何硬币。

接下来,我们使用两层循环来遍历金额和硬币的组合情况。外层循环从1到目标金额,内层循环遍历硬币的面额。对于每个金额i,我们尝试使用每个硬币coin来凑出金额i。如果当前金额i大于等于硬币面额coin,说明可以使用硬币coin来凑出金额i,此时更新dp[i]为dp[i - coin] + 1,表示使用硬币coin后的最小硬币数量。最终,dp[amount]即为凑出目标金额所需的最小硬币数量。

这个算法的时间复杂度为O(amount * n),其中n为硬币的面额数量。通过动态规划的思想,我们避免了递归函数中的重复计算,提高了算法的效率和性能。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器CVM:https://cloud.tencent.com/product/cvm
  • 云数据库MySQL:https://cloud.tencent.com/product/cdb_mysql
  • 云原生容器服务TKE:https://cloud.tencent.com/product/tke
  • 人工智能平台AI Lab:https://cloud.tencent.com/product/ailab
  • 物联网平台IoT Hub:https://cloud.tencent.com/product/iothub
  • 移动开发平台MPS:https://cloud.tencent.com/product/mps
  • 云存储COS:https://cloud.tencent.com/product/cos
  • 区块链服务BCS:https://cloud.tencent.com/product/bcs
  • 元宇宙服务:https://cloud.tencent.com/product/metaspace
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一文带你入门动态规划

时间复杂度分析 二叉树节点个数指数级别,所求子问题个数O(2^n) 解决一个子问题时间O(1),因为值涉及到一个加法运算 故时间复杂度 O(2^n) 消耗内存与时间情况 ?...2.解法二,备忘录解法 解法1中我们也介绍了暴力解法中存在问题,及其问题存在原因,那么解法二中我们就通过加上备忘录方式,来避免重复计算,这样可以大大提高解题效率 代码 class Solution...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币数量是无限。...,amount当前还剩数量,account所用硬币数量*/ public int findMin(int[] coins,int amount){ /*结束递归条件...函数含义来表现“状态”和选择 分析 1.最基本条件即 钱金额0时候所需硬币0 2.状态就是钱总金额,随着决策树一层一层决策,金额不断减少 3.发生状态变化条件,每选择一枚硬币就减少一定金额

41420

从零钱兑换再看动态规划套路

昨天文章关于背包问题一点发散[1]之后,有小伙伴说感觉跟LeetCode上一道题零钱兑换[2]很像,但是又好像有点不一样,简单暴力递归跟缓存优化都能做出来,就是自下而上方法不怎么有思路。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...暴力递归无需过多分析了,无非是递归地做选择,选择硬币,然后选择硬币最少那个方案。 咱们直接上递归代码,咱们主要思考分析工作在后期算法优化上。...原谅我不会画表格,当我们只有面值硬币时,我们要还多少钱就要多少个硬币。...当我们有面值1,2两种硬币时,当我们对5进行兑换时,不选择2这个面值的话,dp[0][5]是5,也就是我们需要5个面值1硬币,而dp[1][3]是是2,那这种情况兑换硬币就只要3个。

43120

刷题第10篇:从完全平方到零钱兑换

1、解决思路 不难看出,这道题目的状态转移方程:nums[n] = Math.min(nums[n],nums[n - i* i] + 1),我们可以使用迭代方法,不断迭代调用之前每一个数字平方数之和最小个数...题目描述 简言之,使用最少硬币数量,兑换成给定金额。 1、解决思路 我们对比一下上面的完全平方数题目,会惊奇发现,其实两者本质上是完全一样呀!哈哈!...所以当时我们遍历时候,使用代码是下面这样: for(int i = 1 ; n >= i*i ; i++ ) 在这道题目中,题目已经明确给出了coins集合类型,所以我们可以尝试着每次遍历给定...coins集合: for(int coin:coins) 当我们更改遍历方式时候,我们就需要额外考虑一种情况了,每次调用递归调用时候,可能会出现一种target变为负值情况,此时意味着target...值小于coin值,那么此时是无法兑换

26120

【LeetCode两题选手】算法类题目(8.7)

},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1} 解释:给定二叉树如图 A 所示,你函数应该填充它每个...使用递归解题也符合要求,本题中递归程序占用栈空间不算做额外空间复杂度。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...思路:背包问题 首先想最少硬币数,肯定是尽量取较大硬币,能取一个则硬币数加一,取当前硬币个数等于之前硬币个数加上当前这个硬币(也就是加1),但前提是之前硬币总价值加上当前这个硬币价值不能超过总个数...,因此是一个动态规划问题

26320

破解大厂最难算法命面试:动态规划之硬币兑换

动态规划问题中,有一个很常见问题就是最少硬币兑换。假设当前有面额1,2,5元硬币,然后给你一定额度,要求你将额度兑换成等值硬币,并要求兑换硬币数量要最少。...例如给定额度9元,那么兑换方法有[5, 1, 1, 1, 1], [5,2,2], [2,2,2,1],很显然第二种兑换方法最好。 如果你了解前面描述动态规划方法,那么这个问题处理不难。...最顶层是要兑换面额,然后根据不同硬币数值进行兑换后得到第二层,例如当前硬币数值[1,2,5],面额9,那么分别兑换硬币1,2,5后所得数额分别为8,7,4,接下来分别针对第二层3个节点进行相应操作...,因此得到问题解,那么从根节点到当前节点对应数值就是所兑换硬币数值。...同时需要注意是,并发每个节点都能再延伸出下层节点,例如第二层节点4因为不能再使用面值5硬币兑换,因此它不能产生对应分支。

44620

本周小结!(动态规划系列五)

组合总和 Ⅳ中给定一个由正整数组成且不存在重复数字数组,找出和给定目标正整数组合个数(顺序不同序列被视作不同组合)。...递归公式:dp[i] += dp[i - nums[j]]; 这个和前上周讲组合问题又不一样,关键就体现在遍历顺序上! 动态规划:518.零钱兑换II 中就已经讲过了。...此时大家应该发现这就是一个完全背包问题了! 和昨天题目动态规划:377. 组合总和 Ⅳ基本就是一道题了,遍历顺序也是一样一样!...周三 动态规划:322.零钱兑换给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数(每种硬币数量是无限)。...零钱兑换、动态规划:279.完全平方数 此时我们就已经把完全背包遍历顺序研究透透了!

61520

零钱兑换 II-----完全背包套路模板

---- 零钱兑换 II 题解集合 完全背包(朴素解法) 完全背包(一维优化) 注意双重for循环顺序 动态规划注意事项总结 记忆化搜索解法 ---- 完全背包(朴素解法) leetcode 322...零钱兑换中,我们求是「取得特定价值所需要最小物品个数」。 对于本题,我们求是「取得特定价值方案数量」。 求东西不一样,但问题本质没有发生改变,同样属于「组合优化」问题。...因为后者更为常用,所以我们再来回顾一下如何进行 换元一维优化 : 二维解法基础上,直接取消「物品维度」 确保「容量维度」遍历顺序「从小到大」(适用于「完全背包」) 将形如 dp[i][j-k*val...---- 记忆化搜索解法 递归结束条件:凑出了目标钱数,找到了一种方案,返回1 , 或者枚举完了所有硬币,即越界了,说明当前没有可行方案,返回0 递归返回值:返回当前方案数 本级递归做什么:遍历硬币数组...可能存在方案数进行累加求和 注意暴力递归会超时,这里还需要用依赖哈希表来存储已经求出来结果,防止重复计算 其实如果用递归解,最好方法还是把问题转化为多叉树遍历,比较容易理解 那么重复计算是从哪里来

35340

数据结构与算法入门手册

图片 第一部分:算法概述 算法定义:一系列解决问题清晰易行步骤和规则。以编程实现,输入问题实例,输出问题解。 算法特征:输入、输出、有穷性、确定性、可行性。...算法类族:递归算法、迭代算法、确定算法、非确定算法、Exact算法、Heuristic算法等。递归算法通过递归解决子问题,迭代通过循环;确定算法对每组输入都给出同样输出,非确定算法输出随输入变化。...第二部分:常用算法类型 图片 递归算法:子问题解决依赖于递归算法,典型例子阶乘函数、斐波那契数列。需设置终止条件,否则会出现栈溢出。 贪心算法:在当前选项中做最佳选择,典型例子硬币找零、最小生成树。...递归算法:通过递归解决子问题,典型例子阶乘函数、斐波那契数列。需设置终止条件,否则栈溢出。...硬币找零:每次取面值最大硬币,直到零钱数0。 Prim算法:每次选取与当前树相连权值最小边,直到所有点被选取。 分治算法:通过递归问题划分为相同或相似子问题,典型例子二分查找、快速排序。

53840

【动态规划背包问题】强化「换元一维优化」技巧

前言 今天是我们讲解「动态规划专题」中 「背包问题第七天。 本篇我们继续完成与 完全背包 相关练习题,共三篇。 本篇是第三篇,第一篇 这里,第二篇 这里。...另外,我文章结尾处列举了我所整理关于背包问题相关题目。 背包问题我会按照编排好顺序进行讲解(每隔几天更新一篇,确保大家消化)。...你也先可以尝试做做,也欢迎你向我留言补充,你觉得与背包相关 DP 类型题目 ~ 题目描述 这是 LeetCode 上「518. 零钱兑换 II」,难度 Medium。...给定不同面额硬币和一个总金额。 写出函数来计算可以凑成总金额硬币组合数。 假设每一种面额硬币有无限个。...零钱兑换 中,我们求是「取得特定价值所需要最小物品个数」。 对于本题,我们求是「取得特定价值方案数量」。 求东西不一样,但问题本质没有发生改变,同样属于「组合优化」问题

1.1K62

LeetCode-322-零钱兑换

# LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...,xi是面值ci硬币数量,由于xi*ci不能超过S,可以得出xi取值范围[0,S/xi] 一个简单解决方案是枚举每个硬币数量子集[x0,......如果满足上述约束条件,计算硬币数量总和并返回所有子集中最小值 for循环每一个硬币,选择0个1面值硬币,判断当前选择情况*面值是否小于等于总面值S,进入下层递归选择硬币应该固定1面值,选择2面值,idxCoin...,cn-1]:可选n枚硬币面额值 这个问题有一个最优子结构性质,这是解决动态规划问题关键。最优解可以从其子问题最优解构造出来。如何将问题分解成子问题?...下列递推关系成立: 在上面的递归树中,可以发现有许多子问题被多次计算。例如,F(1)被计算了13次。

50920

LeetCode-322-零钱兑换

# LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...,xi是面值ci硬币数量,由于xi*ci不能超过S,可以得出xi取值范围[0,S/xi] 一个简单解决方案是枚举每个硬币数量子集[x0,......如果满足上述约束条件,计算硬币数量总和并返回所有子集中最小值 for循环每一个硬币,选择0个1面值硬币,判断当前选择情况*面值是否小于等于总面值S,进入下层递归选择硬币应该固定1面值,选择2面值,idxCoin...,cn-1]:可选n枚硬币面额值 这个问题有一个最优子结构性质,这是解决动态规划问题关键。最优解可以从其子问题最优解构造出来。如何将问题分解成子问题?...下列递推关系成立: 在上面的递归树中,可以发现有许多子问题被多次计算。例如,F(1)被计算了13次。

47710

动态规划详解(修订版)

显然二叉树节点总数指数级别,所以子问题个数 O(2^n)。 解决一个子问题时间,本算法中,没有循环,只有 f(n - 1) + f(n - 2) 一个加法操作,时间 O(1)。...解决一个子问题时间,同上,没有什么循环,时间 O(1)。 所以,本算法时间复杂度是 O(n)。比起暴力算法,是降维打击。 至此,带备忘录递归解法效率已经和迭代动态规划一样了。...比如你想求amount = 11时最少硬币数(原问题),如果你知道凑出amount = 10最少硬币数(子问题),你只需要把子问题答案加一(再选一枚面值 1 硬币)就是原问题答案,因为硬币数量是没有限制...然后确定dp函数定义:函数 dp(n)表示,当前目标金额是n,至少需要dp(n)个硬币凑出该金额。 然后确定「选择」并择优,也就是对于每个状态,可以做出什么选择改变当前状态。...3、dp 数组迭代解法 当然,我们也可以自底向上使用 dp table 来消除重叠子问题,dp数组定义和刚才dp函数类似,定义也是一样: dp[i] = x表示,当目标金额i时,至少需要x枚硬币

52350

期望最大化(Expectation Maximization)算法简介和Python代码实现(附代码)

它是一种迭代算法,可以将一个困难优化问题分解几个简单优化问题本文中将通过几个简单示例解释它是如何工作。...对 p_1 取对数似然函数导数,将其设置零并求解 p_1。当区分对数似然函数时,涉及 p_2 导数将等于 0。所以我们只使用涉及硬币 1 实验数据。... EM 算法中,我们对这些概率进行初步猜测,然后两个步骤之间迭代(估计偏差给定使用每个硬币概率和估计使用每个硬币给定偏差概率)直到收敛。...让我们将隐藏变量 Z 包含在似然函数中以获得完全似然: 完全似然函数对数: 这样就没有对数内求和,更容易解决这个函数最大化问题。...现在让我们试着让问题变得更复杂一些。假设选择每个硬币概率是未知。那么我们将有两个二项式混合,选择第一个硬币概率 tau,选择第二个硬币概率 1-tau。 我们重复与之前相同步骤。

66830

动态规划: 给我个机会,我再兑换一次零钱

star支持一下吧 动态规划:518.零钱兑换II中我们已经兑换一次零钱了,这次又要兑换,套路不一样!...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币数量是无限。...,可以看出是典型完全背包问题。...动态规划专题我们讲过了求组合数是动态规划:518.零钱兑换II,求排列数是动态规划:377. 组合总和 Ⅳ。...这也是我为什么要先讲518.零钱兑换II 然后再讲本题即:322.零钱兑换,这是Carl良苦用心那。 相信大家看完之后,对背包问题遍历顺序又了更深理解了。

46110

期望最大化(Expectation Maximization)算法简介和Python代码实现

期望最大化(EM)算法被广泛用于估计不同统计模型参数。它是一种迭代算法,可以将一个困难优化问题分解几个简单优化问题本文中将通过几个简单示例解释它是如何工作。...对 p_1 取对数似然函数导数,将其设置零并求解 p_1。当区分对数似然函数时,涉及 p_2 导数将等于 0。所以我们只使用涉及硬币 1 实验数据。... EM 算法中,我们对这些概率进行初步猜测,然后两个步骤之间迭代(估计偏差给定使用每个硬币概率和估计使用每个硬币给定偏差概率)直到收敛。...让我们将隐藏变量 Z 包含在似然函数中以获得完全似然: 完全似然函数对数: 这样就没有对数内求和,更容易解决这个函数最大化问题。...现在让我们试着让问题变得更复杂一些。假设选择每个硬币概率是未知。那么我们将有两个二项式混合,选择第一个硬币概率 tau,选择第二个硬币概率 1-tau。 我们重复与之前相同步骤。

72730

用javascript分类刷leetcode3.动态规划(图文视频讲解)

什么是动态规划动态规划,英文:Dynamic Programming,简称DP,将问题分解互相重叠问题,通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效...动态规划和递归区别:递归和回溯可能存在非常多重复计算,动态规划可以用递归加记忆化方式减少不必要重复计算动态规划解题方法递归+记忆化(自顶向下)动态规划(自底向上)图片解动态规划题目的步骤根据重叠子问题定义状态寻找最优子结构推导状态转移方程确定...零钱兑换 (medium)视频讲解:传送门给你一个整数数组 coins ,表示不同面额硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需 最少硬币个数 。...7,在用2个1,4 * 7 + 2 * 1 = 30,但是我们用5个6,5 * 6 = 30 就能用最少硬币兑换完成方法1.动态规划思路:dp[i]表示兑换面额i所需要最少硬币,因为硬币无限,所以可以自底向上计算...dp[i],对于dp[0~i]每个状态,循环coins数组,寻找可以兑换组合,用i面额减去当前硬币价值,dp[i-coin]加上一个硬币数就是dp[i],最后取最小值就是答案,状态转移方程就是dp

25110

​LeetCode刷题实战322:零钱兑换

今天和大家聊问题叫做 零钱兑换,我们先来看题面: https://leetcode-cn.com/problems/coin-change/ You are given an integer array...给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币数量是无限。...: 输入:coins = [1], amount = 2 输出:2 解题 https://blog.csdn.net/qq_23128065/article/details/104729144 背包问题思路...,然后加上当前这一枚硬币,就是amountindex时所需硬币个数,取这两种可能中最小值就是所需最少硬币个数。...最后ans[amount]中存储就是兑换amount所需硬币个数。

26440
领券