- 浏览: 183609 次
- 性别:
- 来自: 济南
文章分类
最新评论
Coin Change
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.
Note:
You may assume that you have an infinite number of each kind of coin.
Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
Example 2:
coins = [2], amount = 3
return -1.
题目的意思是给定一些不同面值的硬币和一个数值,写一个方法来判断是否能用现有的硬币组成给定的数值。假设每个面值的硬币都有无限个,如果可以组成给定的数值,就返回最少硬币的个数,否则返回-1。
这道题属于动态规划的问题,如果不用动态规划在leetcode上也可以ac,但是速度比较慢。用哈希表记录一个差值,就是给定的数值amount > coins[i]时,每遍历完一遍都更新哈希表,知道找到结果。代码如下:
接下来我们动态规划的方法做,我们用一个数组dp[]来表示从0到amount,如果coins[i] = x时,x属于0到amount,dp[x] = 1; 当 x > coins[i]时,我们要查看之前是否已经计算出总数为x-coins[i]的情况,如果已经计算出,dp[x] = Math.min(dp[i - coins[j]] + 1, dp[x]);如果没有计算出就继续查找。细节的地方需要注意,比如数组的初始化等,代码如下:
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.
Note:
You may assume that you have an infinite number of each kind of coin.
Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
Example 2:
coins = [2], amount = 3
return -1.
题目的意思是给定一些不同面值的硬币和一个数值,写一个方法来判断是否能用现有的硬币组成给定的数值。假设每个面值的硬币都有无限个,如果可以组成给定的数值,就返回最少硬币的个数,否则返回-1。
这道题属于动态规划的问题,如果不用动态规划在leetcode上也可以ac,但是速度比较慢。用哈希表记录一个差值,就是给定的数值amount > coins[i]时,每遍历完一遍都更新哈希表,知道找到结果。代码如下:
public class Solution { public int coinChange(int[] coins, int amount) { if(amount == 0) return 0; Arrays.sort(coins); int result = 1; HashSet<Integer> helper = new HashSet<Integer>(); for(int i = 0; i < coins.length; i++) { if(coins[i] == amount) { return result; } else if(amount > coins[i]) { helper.add(amount - coins[i]); } } boolean flag = true; while(flag) { HashSet<Integer> newset = new HashSet<Integer>(); result ++; for(int newAmount : helper) for(int coin : coins) { if(newAmount == coin) { return result; } else if(newAmount > coin) { if(newAmount - coin >= coins[0]) { newset.add(newAmount - coin); } } else { break; } } if(newset.isEmpty()) { flag = false; } else { helper = newset; } } return -1; } }
接下来我们动态规划的方法做,我们用一个数组dp[]来表示从0到amount,如果coins[i] = x时,x属于0到amount,dp[x] = 1; 当 x > coins[i]时,我们要查看之前是否已经计算出总数为x-coins[i]的情况,如果已经计算出,dp[x] = Math.min(dp[i - coins[j]] + 1, dp[x]);如果没有计算出就继续查找。细节的地方需要注意,比如数组的初始化等,代码如下:
public class Solution { public int coinChange(int[] coins, int amount) { int[] dp = new int[amount + 1]; for(int i = 1; i < dp.length; i++) dp[i] = Integer.MAX_VALUE; for(int i = 1; i < dp.length; i++) { for(int j = 0; j < coins.length; j++) { if(i - coins[j] == 0) { dp[i] = 1; break; } else if(i - coins[j] > 0) { int val = dp[i - coins[j]]; if(val != Integer.MAX_VALUE) { dp[i] = Math.min(dp[i], val + 1); } } } } return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount]; } }
发表评论
-
498. Diagonal Traverse
2019-11-15 13:52 265Given a matrix of M x N eleme ... -
496 Next Greater Element I
2019-11-14 13:50 267You are given two arrays (witho ... -
Word Break II
2016-03-09 03:15 384Given a string s and a dictiona ... -
Insert Interval
2016-03-08 02:11 374Given a set of non-overlapping ... -
Merge Intervals
2016-03-07 05:25 497Given a collection of intervals ... -
Merge k Sorted Lists
2016-03-07 04:03 563Merge k sorted linked lists and ... -
Multiply Strings
2016-03-06 07:27 475Given two numbers represented a ... -
N-Queens II
2016-03-06 03:06 664Follow up for N-Queens problem. ... -
N-Queens
2016-03-06 02:47 469The n-queens puzzle is the prob ... -
First Missing Positive
2016-03-05 03:09 429Given an unsorted integer array ... -
Spiral Matrix
2016-03-04 03:39 575Given a matrix of m x n element ... -
Trapping Rain Water
2016-03-04 02:54 580Given n non-negative integers r ... -
Repeated DNA Sequences
2016-03-03 03:10 426All DNA is composed of a series ... -
Increasing Triplet Subsequence
2016-03-02 02:48 898Given an unsorted array return ... -
Maximum Product of Word Lengths
2016-03-02 01:56 930Given a string array words, fin ... -
LRU Cache
2016-02-29 10:37 602Design and implement a data str ... -
Super Ugly Number
2016-02-29 07:07 674Write a program to find the nth ... -
Longest Increasing Path in a Matrix
2016-02-29 05:56 843Given an integer matrix, find t ... -
Coin Change
2016-02-29 04:39 783You are given coins of differen ... -
Minimum Height Trees
2016-02-29 04:11 705For a undirected graph with tre ...
相关推荐
在计算机科学领域,"Coin Change"问题是一个经典的问题,它涉及到计算在给定一组不同面值的硬币时,组成特定总金额的最少硬币数量。这个问题源自实际生活中的找零场景,但它的理论意义远超其应用场景。在本篇讨论中...
CoinChange.java
public int coinChange(int[] coins, int n) { if (n ) return -1; int[] dp = new int[n + 1]; Arrays.fill(dp, Integer.MAX_VALUE); dp[0] = 0; for (int coin : coins) { for (int i = coin; i ; i++) { ...
def coinChange(coins, amount): dp = [0] * (amount + 1) dp[0] = 1 # 金额为0时,有1种空集组合 for i in range(1, amount + 1): for coin in coins: if coin dp[i] += dp[i - coin] return dp[amount] ``...
文件`coinchange.py` 和 `coinchange - 副本.py` 可能涉及的是找零问题,即给定一套硬币面额,求解最少数量的硬币组合,使得总价值等于给定的目标金额。这个问题通常用动态规划解决,通过维护一个状态数组记录到达...
### 动态规划解决找零问题 #### 一、引言 找零问题是计算机科学中的一个经典问题,尤其是在算法设计领域。这个问题的核心是如何利用最少数量的硬币来组成某个特定金额。例如,如果需要找零12元,而手头有的硬币面额...
c c语言_leetcode题解之0322_coin_change
在这份资源中,我们将讨论四个leetcode问题的解决方案,包括_single element in a sorted array_、_coin change 2_、_largest palindrome product_和_find all duplicates in an array_。 Single Element in a ...
def coinChange(coins, amount): if amount return -1 coins.sort(reverse=True) # 先将硬币按值降序排列,便于处理 dp = [float('inf')] * (amount + 1) dp[0] = 0 for i in range(len(coins)): for j in ...
change.append(coin) return change if amount == 0 else "无法用现有硬币找零" coins = [1, 5, 10, 25] amount = 37 print(greedy_change(coins, amount)) # 输出:[25, 10, 1, 1] ``` 在这个例子中,我们试图...
Coin Change和Coin Change 2分别考虑是否允许无限个硬币和不完全填充目标金额的情况。 9. **Edit Distance** (编辑距离) 计算两个字符串之间的最小编辑操作次数,包括插入、删除和替换。使用二维动态规划,状态...
零钱个数最少问题,也称为“ coin change problem ”,是一个经典的动态规划问题。我们可以使用动态规划的方法来解决它。动态规划是一种通过将复杂问题分解为更小的子问题来求解的方法。在零钱个数最少问题中,我们...
int coinChange(std::vector<int>& coins, int amount) { std::vector<int> d(amount + 1, INT_MAX); d[0] = 0; for (int i = 1; i ; ++i) { for (int coin : coins) { if (i >= coin && d[i - coin] != INT_...
print(coinChange(coins, amount)) # 输出可能的钱币组合数 ``` **详解**:此示例展示了如何使用贪心算法解决钱币找零问题。算法首先初始化一个数组`coin_count`来存储每种金额下可能的组合数。对于每种面额的钱币...
int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount + 1, INT_MAX); // 初始化dp数组,用INT_MAX表示无法组成金额 dp[0] = 0; // 组成0元不需要任何硬币 for (int i = 1; i ; i++) { for...
在编程领域,硬币问题(Coin Change Problem)是一类经典的算法问题,主要涉及组合优化和动态规划。在基于JAVA的实现的16个硬币问题中,我们可以预见到一系列与计算理论、数据结构和算法相关的知识。以下是这些知识...
5. 动态规划(Coin Change Problem): - 题目中提到的硬币找零问题是一个经典的动态规划问题。给定不同面值的硬币,求解最少数量的硬币组合以达到指定金额。 - 动态规划解决方案通常使用一个数组dp,其中dp[i]...
在给定的代码中,`coinChange` 函数实现了上述逻辑。它接收硬币面值数组 `values`、硬币种类数 `valuesCounts`、目标金额 `money` 和一个初始化的 `coinsUsed` 数组作为参数。通过两层循环,第一层遍历所有金额,第...
最小硬币问题(Minimum Coin Change Problem)是一个经典的动态规划问题,常常被用来教授计算机科学中的算法设计。在现实生活中,这个问题通常表现为:给定不同面值的硬币,求解用最少数量的硬币组合成一个给定的...
9. **贪心算法**:在一些具有局部最优解的问题中,贪心策略常常能获得全局最优解,例如"硬币找零"(Coin Change)问题。 10. **分治法**:分治法是一种将复杂问题分解为较小部分进行解决的策略,如"快速排序"...