Recursion (Brute Force)
Intuition
For each amount, we try subtracting every coin denomination and recursively solve for the remaining amount. The answer for a given amount is 1 + min(coinChange(amount - coin)) over all valid coins. The base cases are: amount 0 needs 0 coins, and a negative amount is impossible. This explores all combinations but has exponential time due to overlapping subproblems.
Algorithm
- If `amount == 0`, return `0`.
- If `amount < 0`, return `-1` (impossible).
- Initialize `minCoins` to infinity.
- For each coin, recursively solve `amount - coin` and track the minimum.
- Return `minCoins + 1` if any valid solution was found, otherwise `-1`.
O(S^n) where S is the amount and n is the number of coin denominationsSpaceO(S) for the recursion stackCode (C++ · Java · Python · Go)
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if (amount == 0) return 0;
if (amount < 0) return -1;
int minCoins = INT_MAX;
for (int coin : coins) {
int res = coinChange(coins, amount - coin);
if (res >= 0) {
minCoins = min(minCoins, res + 1);
}
}
return minCoins == INT_MAX ? -1 : minCoins;
}
};class Solution {
public int coinChange(int[] coins, int amount) {
if (amount == 0) return 0;
if (amount < 0) return -1;
int minCoins = Integer.MAX_VALUE;
for (int coin : coins) {
int res = coinChange(coins, amount - coin);
if (res >= 0) {
minCoins = Math.min(minCoins, res + 1);
}
}
return minCoins == Integer.MAX_VALUE ? -1 : minCoins;
}
}from typing import List
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
if amount == 0:
return 0
if amount < 0:
return -1
min_coins = float('inf')
for coin in coins:
res = self.coinChange(coins, amount - coin)
if res >= 0:
min_coins = min(min_coins, res + 1)
return min_coins if min_coins != float('inf') else -1func coinChange(coins []int, amount int) int {
if amount == 0 {
return 0
}
if amount < 0 {
return -1
}
minCoins := math.MaxInt32
for _, coin := range coins {
res := coinChange(coins, amount-coin)
if res >= 0 && res+1 < minCoins {
minCoins = res + 1
}
}
if minCoins == math.MaxInt32 {
return -1
}
return minCoins
}