Leetcode 322. 零钱兑换

曾经终败给现在 2023-02-14 03:06 151阅读 0赞

Leetcode 322. 零钱兑换

  • 1、问题分析
  • 2、问题解决
  • 3、总结

1、问题分析

题目链接:https://leetcode-cn.com/problems/coin-change/
  本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。

2、问题解决

  笔者以C++方式解决。

  1. #include "iostream"
  2. using namespace std;
  3. #include "algorithm"
  4. #include "vector"
  5. #include "queue"
  6. #include "set"
  7. #include "map"
  8. #include "string"
  9. #include "stack"
  10. class Solution {
  11. private:
  12. // 存储 总金额 amount 最少可以用几个不同的硬币,即 最小个数数组
  13. // 例如 dp[5] 对应示例1 dp[5] = 1 ,即只用一个 5 硬币即可
  14. vector<int> dp;
  15. public:
  16. int coinChange(vector<int> &coins, int amount) {
  17. // 如果数组为空,直接返回 -1
  18. if (coins.empty()) {
  19. return -1;
  20. }
  21. // 初始化 最小个数数组
  22. dp.resize(amount + 1);
  23. // 获取 总金额为 amount 的最小硬币数目
  24. int i = dealChen(coins, amount);
  25. // 如果不可达,返回 -1
  26. if (i > amount) {
  27. return -1;
  28. }
  29. // 否则返回计算结果
  30. return i;
  31. }
  32. /** * 获取 总金额为 amount 的最小硬币数目 * @param coins * @param amount * @return */
  33. int dealChen(vector<int> &coins, int amount) {
  34. // amount 说明可以组合成功 返回 0
  35. if (amount == 0) {
  36. return 0;
  37. }
  38. // 小于 0,说明此路不通,理论上返回一个无穷大,
  39. // 但是要考虑程序内存溢出的问题,所以这里
  40. // 使用 INT_MAX / 2 作为 无穷大
  41. if (amount < 0) {
  42. return INT_MAX / 2;
  43. }
  44. // 值已经计算过,直接返回
  45. if (dp[amount] != 0) {
  46. return dp[amount];
  47. }
  48. // 选择第一个硬币,得到的最小数量
  49. int temp = dealChen(coins, amount - coins[0]) + 1;
  50. // 遍历硬币数组,获取最小数量
  51. for (int i = 1; i < coins.size(); ++i) {
  52. int temp2 = dealChen(coins, amount - coins[i]) + 1;
  53. // 选择其中最小的一个
  54. if (temp > temp2) {
  55. temp = temp2;
  56. }
  57. }
  58. // 保存到最小个数数组中
  59. dp[amount] = temp;
  60. // 返回计算结果
  61. return dp[amount];
  62. }
  63. };
  64. int main() {
  65. vector<int> coins = { 1, 2, 5};
  66. Solution *pSolution = new Solution;
  67. int i = pSolution->coinChange(coins, 11);
  68. cout << i << endl;
  69. system("pause");
  70. return 0;
  71. }

运行结果

在这里插入图片描述
有点菜,有时间再优化一下。

3、总结

  难得有时间刷一波LeetCode, 这次做一个系统的记录,等以后复习的时候可以有章可循,同时也期待各位读者给出的建议。算法真的是一个照妖镜,原来感觉自己也还行吧,但是算法分分钟教你做人。前人栽树,后人乘凉。在学习算法的过程中,看了前辈的成果,受益匪浅。
感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
哪怕只有一个人从我的博客受益,我也知足了。
点个赞再走呗!欢迎留言哦!

发表评论

表情:
评论列表 (有 0 条评论,151人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 322 零钱兑换

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

    相关 leetcode322 零钱兑换

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

    相关 322. 零钱兑换

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

    相关 Leetcode 322. 零钱兑换

    题目重述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何

    相关 LeetCode-322. 零钱兑换

    [322. 零钱兑换][322.] 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币