标签:322 int coins next BFS 零钱 amount vector visited
322. 零钱兑换
给你一个整数数组 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
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
BFS:
1 class Solution { 2 public: 3 int coinChange(vector<int>& coins, int amount) { 4 if (amount == 0) { 5 return 0; 6 } 7 sort(coins.begin(), coins.end()); 8 vector<bool> visited(amount + 1, false); 9 queue<int> q; 10 q.push(amount); 11 visited[amount] = true; 12 int step = 1; 13 while (!q.empty()) { 14 int size = q.size(); 15 for (int i = 0; i < size; i++) { 16 int curNode = q.front(); 17 q.pop(); 18 for (auto &coin : coins) { 19 int next = curNode - coin; 20 if (next == 0) { 21 return step; 22 } 23 if (next < 0) { // coins升序排序,当next小于0时后续面值的硬币肯定也不能兑换,跳过 24 break; 25 } 26 if (visited[next]) { 27 continue; 28 } 29 q.push(next); 30 visited[next] = true; 31 } 32 } 33 step++; 34 } 35 return -1; 36 } 37 };
动态规划:
1 class Solution { 2 public: 3 int coinChange(vector<int>& coins, int amount) { 4 int INF = amount + 1; 5 vector<int> dp(amount + 1, INF); 6 dp[0] = 0; 7 for (int i = 1; i <= amount; i++) { 8 for (int j = 0; j < (int)coins.size(); j++) { 9 if (coins[j] <= i) { 10 dp[i] = min(dp[i], dp[i - coins[j]] + 1); 11 } 12 } 13 } 14 return dp[amount] > amount ? -1 : dp[amount]; 15 } 16 };
标签:322,int,coins,next,BFS,零钱,amount,vector,visited 来源: https://www.cnblogs.com/MGFangel/p/16296418.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。