日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode每周算法】零钱兑换

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode每周算法】零钱兑换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/coin-change

給你一個整數數組 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。

計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回?-1 。

你可以認為每種硬幣的數量是無限的。

示例?1:

輸入:coins = [1, 2, 5], amount = 11
輸出:3?
解釋:11 = 5 + 5 + 1
示例 2:

輸入:coins = [2], amount = 3
輸出:-1
示例 3:

輸入:coins = [1], amount = 0
輸出:0
示例 4:

輸入:coins = [1], amount = 1
輸出:1
示例 5:

輸入:coins = [1], amount = 2
輸出:2
?

提示:

1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104


分析

一些分析內容,借鑒自博客:https://juejin.cn/post/6985150114134229022

怎么感覺像是回到了小學應用題?

1、暴力窮舉逐個排除

簡單分析一下: 最小硬幣組合 -> 盡量用大的硬幣

這傻不拉幾的題誰出的,這么簡單

????????7+7+7=21,21+2+2+2=27, 6枚硬幣

臥槽

????????7+5+5+5+5=27, 5枚硬幣

我們可以很暴力的想一想,從大往小的算,可以加起來不超過27,比如

????????7+7+7+7 > 27 (排除)

????????7+7+7+5 或者 7 +7 +7+2+2+2 6枚

????????....

窮舉太慢了,還會涉及到很多的重復計算,如果我想要27以內的任何值最小的硬幣組合呢,想想都頭大了吧。

既然計算機可以通過內存保存之前的內容,又快,很明顯,我們開一個數組來保存之前的狀態。

2.動態規劃分析

雖然我們不知道最優策略是什么,但是最優策略肯定是K枚硬幣,a1, a2, ....ak面值加起來是27

所以一定有一枚最后的硬幣:ak.? 除掉這么硬幣,前面硬幣的面值加起來是27-ak

關鍵點1:

  • 我們不關心前面的k-1枚硬幣是怎么拼出27-ak的(可能有一種拼法,也可能有100種拼法),而且我們現在甚至還不知道ak和K, 但是我們確定前面的硬幣拼出了27-ak

關鍵點2:

  • 因為是最優策略, 所以拼出27-ak的硬幣數一定要最少,否則這就不是最優策略了

子問題

  • 所以我們就要求:最少用多少枚硬幣可以拼出27-ak
  • 原問題是最少用多少枚硬幣拼出27
  • 我們將原問題轉化了一個子問題,而且規模更小:27-ak
  • 為了簡化定義, 我們設狀態f(x)=最少用多少枚硬幣拼出x

等等,我們還不知道最后的那枚硬幣ak是多少

  • 很明顯,最后的那枚硬幣只能是2,5或者7
  • 如果ak是2, f(27)應該是f(27-2)+1(1代表最后一枚硬幣2)
  • 如果ak是5, f(27)應該是f(27-5)+1(1代表最后一枚硬幣5)
  • 如果ak是7, f(27)應該是f(27-7)+1(1代表最后一枚硬幣7)
  • 所以使用最少的硬幣數=f(27) = min{f(27-2)+1, f(27-5)+1, f(27-7)+1}

    2.1遞歸解法

    private static Map<Integer, Integer> cache = new HashMap<>();static {// 退出條件cache.put(2, 1);cache.put(3, -1);cache.put(4, 2);cache.put(5, 1);cache.put(6, 3);cache.put(7, 1);}// 2,5,7三種硬幣public static int minCoin(int target) {if (target < 2) {return -1;}Integer integer = cache.get(target);if (integer != null) {return integer;}// if (target == 2) { // return 1; // } // if (target == 3) { // return -1; // } // if (target == 4) { // return 2; // } // if (target == 5) { // return 1; // } // if (target == 6) { // return 3; // } // if (target == 7) { // return 1; // }int[] result = {minCoin(target - 2) + 1,minCoin(target - 5) + 1,minCoin(target - 7) + 1};int min = min(result);cache.put(target, min);return min;}public static int min(int[] valArr) {if (valArr == null || valArr.length < 1) {return Integer.MIN_VALUE;}int val = Integer.MIN_VALUE;for (int i : valArr) {if (i > 0) {val = val > 0 ? Math.min(val, i) : i;}}return val;}

    2.2動態規劃

    轉移方程:

    • 設狀態f(x)=最少用多少枚硬幣拼出x
    • 對于任意的x : f(X) = min{f(X-2)+1, f(X-5)+1, f(X-7)+1}

    初始條件和邊界情況:

    • 提出問題
      • x-2, x-5, x-7 小于0怎么辦?
      • 什么時候停下來?

    如果不能拼出Y, 就定義f[Y] = 正無窮

    例如f[-1], f[-2] = 正無窮

    例如:拼不出f[1]=min{f(-1)+1, f(-3)+1, f(-6)+1}

    初始條件:f[0] = 0

    計算順序

    計算:f[1], f[2], ... f[27]

    當我們計算到f[x], f[x-2], f[x-5], f[x-7] 都已經得到結果了。如圖:

    上圖7只需要一個硬幣。

    f[x] = 最少用多少枚硬幣拼出x

    f[x] = ∞ 表示無法用硬幣拼出x

    public static int coinChange(int [] A, int M ) {int[] f = new int[M+1];int n = A.length;f[0] = 0;int i,j;for (i = 1; i<=M; i++) {f[i] = Integer.MAX_VALUE;for (j = 0; j< n;j++) {// 邊界條件判斷if (i >= A[j] && f[i - A[j]] != Integer.MAX_VALUE) {f[i] = Math.min(f[i - A[j]] + 1, f[i]);// System.out.println(i + "=" +f[i]);}}}if (f[M] == Integer.MAX_VALUE) {f[M] = -1 ;}return f[M]; }

    總結

    以上是生活随笔為你收集整理的【LeetCode每周算法】零钱兑换的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产97色在线 | 日韩 | 久久久久久免费观看 | 狠狠躁夜夜躁人人爽天天高潮 | 亚洲午夜精品一区二区 | 欧美视频免费看欧美视频 | 中文字幕精品无码亚 | aaa天堂| 性视频网 | 国产富婆一级全黄大片 | 日女人网站 | 亚洲小说区图片区 | 亚洲国产成人在线 | 婷婷激情丁香 | www.香蕉视频.com| 人人艹人人 | 在线观看黄色片网站 | 日韩精品免费一区二区在线观看 | 亚洲综合激情 | 大乳女喂男人吃奶 | 找国产毛片看 | www.黄色. | 亚洲性xxx| 蜜桃91精品入口 | 在线观看亚洲视频 | 丝袜美腿亚洲综合 | 青娱乐福利视频 | 在线天堂网 | 激情午夜网 | 国产精品偷拍 | free性欧美69巨大 | 精品久久久久久久久久久久久久久久久久 | 精品国产91乱码一区二区三区 | 欧美精品一区三区 | 亚洲欧美天堂 | 中文字幕人妻一区二区 | 91在线观看免费高清 | 成人日批 | 成人区人妻精品一熟女 | 麻豆最新网址 | 日本一区免费看 | 国语av在线 | 中文字幕一区二 | 亚洲三级黄 | 爱情岛论坛成人av | 欧美专区在线视频 | 亚洲一级黄色片 | 日韩精品在线一区二区三区 | 欧美激情亚洲综合 | 欧美激情小视频 | 免费黄色片视频 | 在线日韩一区 | 老司机福利院 | 天堂精品在线 | 色屁屁ts人妖系列二区 | 国产男男gay | 国产精品国产自产拍高清av | 四虎永久免费在线观看 | 草久视频在线观看 | 一边吃奶一边摸做爽视频 | 日韩欧美www | wwwxx国产 | 在线视频自拍 | 国产精品美女久久久免费 | 求个黄色网址 | 久久久久人妻精品一区二区三区 | 香蕉久久久| 日韩免费视频 | 久久亚洲av无码精品色午夜麻豆 | 久久精品7 | 国产成人精品久久二区二区 | 91麻豆网 | 欧州一区二区三区 | 艹男人的日日夜夜 | 天天操夜操 | 国产精品人人妻人人爽人人牛 | 1000部做爰免费视频 | 美女涩涩网站 | 日本激情网址 | eeuss国产一区二区三区黑人 | 欧美日韩一级在线观看 | 欧美精品自拍 | 免费成年人视频在线观看 | 99r在线视频 | 免费三级黄 | 国模在线 | 一道本在线视频 | 在线日韩一区 | 91色漫| 麻豆日产六区 | 国产尤物视频在线观看 | 精品国产户外野外 | 久久色婷婷 | 人妻激情偷乱视频一区二区三区 | 久久久久亚洲av成人片 | 99小视频 | 丰满少妇一区二区三区视频 | 久久七 | 天天干精品 | 色香av |