日韩性视频-久久久蜜桃-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每周算法】零钱兑换的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 性猛交xxxx乱大交孕妇印度 | 亚洲AV成人无码久久精品同性 | 一区二区在线免费观看视频 | 日本黄色三级视频 | 欧美日韩女优 | 久久久久久av无码免费网站下载 | 成人av影视在线观看 | 亚洲狼人伊人 | 黄色激情在线观看 | 在线免费看mv的网站入口 | 国产黄色片在线播放 | www.色就是色 | 免费看v片 | 日韩成人激情 | 成人做爰69片免费看 | 亚洲情se | 中文天堂网 | 亚洲精品国产精品国自产观看浪潮 | 亚洲三区视频 | 国产精品亚洲二区在线观看 | 美利坚合众国av | 别揉我奶头啊嗯一区二区 | 亚洲 欧美 成人 | 国产乱人乱偷精品视频a人人澡 | xxx日韩 | 亚洲黄色片在线观看 | 中文天堂在线资源 | 丰满护士巨好爽好大乳 | 亚洲国产精品一区二区三区 | 波多野结衣视频网站 | 91成人在线观看喷潮动漫 | 国产精品入口夜色视频大尺度 | 欧美区在线观看 | 一本色道久久综合无码人妻 | 欧洲美女与动交ccoo | 手机看片1024欧美 | 欧美a√| 中国黄色片子 | 999黄色片| 淫语视频| 91看片在线 | 手机看片福利在线 | 91最新地址永久入口 | 800av免费在线观看 | 青草热视频 | 爱爱爱爱网 | 国产精品久久网站 | 成人激情久久 | 蜜桃91精品入口 | 亚洲在线视频 | 欧美乱轮| 另类国产| 老湿影院av | 精品一区二区三区毛片 | 40一50一60老女人毛片 | 天天拍夜夜爽 | 另类小说欧美 | 亚洲一区二区三区婷婷 | 亚洲30p| 亚洲成人无码久久 | 97精品一区二区 | 亚洲免费视频一区二区 | 亚洲狼人伊人 | 亚洲精品国产精品国自产 | 欧美另类69| 国产精品一区免费 | 亚洲精品www | 欧美日韩黄色网 | 香蕉综合网 | 黄色不卡| 久草青青视频 | 亚洲综合福利 | 超碰九七 | 亚洲狠狠婷婷综合久久久久图片 | 国产精品综合视频 | 国产无遮挡一区二区三区毛片日本 | 麻豆视频在线播放 | 大白屁股一区二区视频 | 亚洲毛片在线播放 | 精品一区二区三区四区 | 日本黄色激情视频 | 中文有码在线 | 秋霞成人午夜鲁丝一区二区三区 | 美女一级黄| 性色tv | 少妇久久久久久被弄到高潮 | 小视频黄色 | 日韩乱码视频 | 日韩一二三四 | 久久蜜桃视频 | 伊人激情视频 | 成人在线免费视频观看 | 黄色三级免费 | 国产精品福利影院 | 亚洲乱色熟女一区二区三区 | 欧美国产日本 | 国产一区二区免费在线观看 | 五月深爱婷婷 | 国产欧美一区二区三区免费看 |