Coin Change 2
Problem​
You are given an integer array coins
representing coins of different denominations and an integer amount
representing a total amount of money. Return the number of combinations that make up that amount. If that amount of money cannot be made up by any combination of the coins, return 0
.
Examples​
Example 1:
Input: amount = 5, coins = [1, 2, 5]
Output: 4
Explanation: There are four ways to make up the amount:
- 5 = 5
- 5 = 2 + 2 + 1
- 5 = 2 + 1 + 1 + 1
- 5 = 1 + 1 + 1 + 1 + 1
Example 2:
Input: amount = 3, coins = [2]
Output: 0
Explanation: The amount of 3 cannot be made up just with coins of 2.
Example 3:
Input: amount = 10, coins = [10]
Output: 1
Constraints​
1 <= coins.length <= 300
1 <= coins[i] <= 5000
- All the values of
coins
are unique. 0 <= amount <= 5000
Approach​
To solve this problem, we can use dynamic programming. We will create a 1D array dp
where dp[i]
represents the number of ways to make the amount i
using the given coins.
Steps:​
- Initialize a 1D array
dp
of sizeamount + 1
with all elements set to0
. - Set
dp[0] = 1
because there is one way to make the amount0
, which is to use no coins. - For each coin in the
coins
array:- Update the
dp
array from the current coin's value up to theamount
. - For each amount
i
from the coin's value toamount
, add the number of ways to make the amounti - coin
todp[i]
.
- Update the
- The value
dp[amount]
will be the result.
Solution​
Java​
class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
}
C++​
#include <vector>
using namespace std;
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount + 1, 0);
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
};
Python​
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [0] * (amount + 1)
dp[0] = 1
for coin in coins:
for i in range(coin, amount + 1):
dp[i] += dp[i - coin]
return dp[amount]
Complexity Analysis​
Time Complexity: O(n * amount)
Reason: The nested loops iterate over the coins array and the amount, leading to a time complexity of O(n * amount), where n is the number of coins.
Space Complexity: O(amount)
Reason: The space complexity is O(amount) due to the 1D dp array used to store the number of combinations for each amount.
References​
LeetCode Problem: Coin Change 2