题目

322. 零钱兑换

难度:中等

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1

示例 2:

输入: coins = [2], amount = 3
输出: -1

说明:
你可以认为每种硬币的数量是无限的。

解法1-递归

思路:与爬楼梯问题类似,比如11块,能分成最小的硬币数[1,2,5]。 f(n) = min(f(n-1), f(n-2),f(n-5)) +1 即要到达第n个台阶,可能有三种情况,上一步(子问题)是f(n-1) 或f(n-2)或f(n-5) ,再+1步到达f(n), 此时取三者(上一步)中最小的,再加1即为结果。下面代码中的amount相当于n阶台阶,coin相当于一次可以上升的台阶数。

// ONGING: 超时?未通过(递归重复调用?)

int coinChange(vector<int>& coins, int amount)
{if (amount < 0) return -1;if (amount == 0) return 0;int ans = INT_MAX;for(int coin : coins){if (amount-coin < 0) continue;int subProb = coinChange(coins, amount - coin);if (subProb == -1) continue;ans = min(ans, subProb + 1);}return ans == INT_MAX ? -1 : ans;
}

解法2-动态规划

思路:

代码:

int coinChange(vector<int>& coins, int amount) {int Max = amount + 1;vector<int> dp(amount + 1, Max);    //初始化dp数组元素:如11元,最少币数12dp[0] = 0;for (int i = 1; i <= amount; ++i) {  // i从1开始 dp[i] 表示组成i元需要的最少硬币数for (int j = 0; j < (int)coins.size(); ++j) {if (coins[j] <= i) {dp[i] = min(dp[i], dp[i - coins[j]] + 1); //在j的迭代过程中,选择f(n-1)、f(n-2、f(n-5)最小的(假设coins=[1,2,5]),再加1}}}return dp[amount] > amount ? -1 : dp[amount];  //初始化的dp元素没有被修改(如12>11),意味着无解,返回-1
}

复杂度分析

  • 时间复杂度:O(Sn),其中 S 是金额,n 是面额数。我们一共需要计算 O(S) 个状态,S 为题目所给的总金额。对于每个状态,每次需要枚举 n 个面额来转移状态,所以一共需要 O(Sn) 的时间复杂度。
  • 空间复杂度:O(S)。DP 数组需要开长度为总金额 S 的空间。

算法笔记_面试题_8.零钱兑换相关推荐

  1. python解决换零钱问题_多种解法解决“零钱兑换”问题

    最近在LeetCode上刷算法题,准备秋招.刷了一些题之后,发现有些题非常棒,能够将多种知识点结合在一起.本文就以"零钱兑换"问题为例,展示同一道题的多种不同解法. 零钱兑换问题 ...

  2. 【算法题目】DFS BFS 动态规划 零钱兑换 Python

    322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 amount ,表示总金额.计算并返回可以凑成总金额所需的 最少的硬币个数 .如果没有任何一种硬币组合能组成总金额 ...

  3. 第2章KNN算法笔记_函数classify0

    <机器学习实战>知识点笔记目录 K-近邻算法(KNN)思想: 1,计算未知样本与所有已知样本的距离 2,按照距离递增排序,选前K个样本(K<20) 3,针对K个样本统计各个分类的出现 ...

  4. 回溯 皇后 算法笔记_算法笔记_04_回溯

    设计思想: (1)适用:求解搜索问题和优化问题. (2)搜索空间:数,节点对应部分解向量,可行解在树叶上. (3)搜索过程:采用系统的方法隐含遍历搜索树. (4)搜索策略:深度优先,宽度优先,函数优先 ...

  5. 回溯 皇后 算法笔记_回溯算法:N皇后问题

    给「代码随想录」一个星标吧! ❝ 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便 ...

  6. 算法笔记_183:历届试题 九宫重排(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成 ...

  7. 算法笔记_172:历届试题 波动数列(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...

  8. 回溯 皇后 算法笔记_什么叫回溯算法,一看就会,一写就废

    什么叫回溯算法 对于回溯算法的定义,百度百科上是这样描述的:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回, ...

  9. 算法笔记_188:历届试题 危险系数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用. 地道的多个站点间有通道连接,形成了庞大的网络.但也有隐患,当敌人发现了某个站点后,其它站点 ...

  10. 回溯 皇后 算法笔记_算法笔记-回溯法

    (1)0-1背包问题 思路:构造一个二叉树,每个商品都有两种状态,要或者不要.如果要就在这个节点的左枝挂子节点,如果不要就在右节点挂子节点.如果全部商品都分配完状态之后就回溯,回溯到一个还有其他选择的 ...

最新文章

  1. MyBatis运行原理(三)接口式编程及创建代理对象原理分析
  2. STL源码剖析 配接器
  3. 乘方计算(信息学奥赛一本通-T1069)
  4. mysql数据库什么是事件_[数据库]Mysql 事件(定时任务)
  5. 学习笔记day1-计算机介绍
  6. 仿迅雷播放器教程 -- 媒体播放器对比 (2)
  7. 巧妙设置XP 家庭或小型办公网络图解
  8. 第二周——团队项目(小小大佬带飞队)
  9. Docker容器——重命名镜像的TAG
  10. 数据库实验4---数据完整性
  11. golang常用的工具包
  12. GO Package、GOPATH、GOMOD、GOROOT、GOPROXY、版本迭代
  13. 好书推荐--《人生不设限》
  14. Signalr 跨域即时聊天
  15. 基于国家统计局城乡规划数据的地名提取(1)
  16. sqrt函数模拟实现的两种方法
  17. 蔡维德:区块链应用落地不是狼来了,而是老虎来了
  18. H3C IRF MAD检测实战
  19. 合合信息CV算法岗在线笔试题目回忆
  20. Cadence Allegro如何设置十字大光标?

热门文章

  1. Spring事务管理—aop pointcut expression解析
  2. JS中遍历普通数组和字典数组的区别
  3. 【十次方基础教程(后台)】Dockerfile脚本完成镜像的构建
  4. 使用Dom4j的xPath解析xml文件------xpath语法
  5. ThinkPHP空操作及命名空间
  6. android布局及其常用属性
  7. [USACO2006][poj3182]The Grove(巧妙的BFS)
  8. python实例31[自动挂载虚拟盘]
  9. 转:extjs里的fieldset不居中的解决办法(记录)
  10. Java中的for循环和JavaScript中的for循环差别初探(01)