Example: [130, 110, 1] 220
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Solution { public int coinChange( int [] coins, int amount) { if (coins == null || coins.length == 0 ) return - 1 ; Arrays.sort(coins); return numberOfCoins(coins, coins.length - 1 , amount); } private int numberOfCoins( int [] coins, int coinIndex, int remainAmount) { if (remainAmount == 0 ) return 0 ; if (coinIndex < 0 ) return - 1 ; int numberOfCurrentCoin = remainAmount / coins[coinIndex]; while (numberOfCurrentCoin >= 0 ) { int numberOfRemainCoin = numberOfCoins(coins, coinIndex- 1 , remainAmount - numberOfCurrentCoin * coins[coinIndex]); if (numberOfRemainCoin >= 0 ) return numberOfRemainCoin + numberOfCurrentCoin; numberOfCurrentCoin--; } return - 1 ; } } |
https://leetcode.com/discuss/76217/java-both-iterative-recursive-solutions-with-explanations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Solution { public int coinChange( int [] coins, int amount) { if (coins == null || coins.length == 0 ) return - 1 ; if (amount <= 0 ) return 0 ; int [] minCoins = new int [amount + 1 ]; minCoins[ 0 ] = 0 ; for ( int i = 1 ; i <= amount; i++) { minCoins[i] = Integer.MAX_VALUE; for ( int coin : coins) { if (i - coin >= 0 && minCoins[i - coin] != Integer.MAX_VALUE) { minCoins[i] = Math.min(minCoins[i], minCoins[i - coin] + 1 ); } } } return minCoins[amount] == Integer.MAX_VALUE ? - 1 : minCoins[amount]; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Solution { public int coinChange( int [] coins, int amount) { if (coins == null || coins.length == 0 ) return - 1 ; if (amount <= 0 ) return 0 ; HashMap<Integer, Integer> amountToCoinNumber = new HashMap<Integer, Integer>(); return coinChangeHelper(coins, amount, amountToCoinNumber); } private int coinChangeHelper( int [] coins, int amount, HashMap<Integer, Integer> amountToCoinNumber){ if (amount == 0 ) return 0 ; if (amount < 0 ) return - 1 ; if (amountToCoinNumber.containsKey(amount)) return amountToCoinNumber.get(amount); int minimumNumber = - 1 ; for ( int coin : coins) { int remainNumber = coinChangeHelper(coins, amount - coin, amountToCoinNumber); if (remainNumber >= 0 ) { minimumNumber = Math.min(minimumNumber == - 1 ? Integer.MAX_VALUE : minimumNumber , remainNumber + 1 ); } } amountToCoinNumber.put(amount, minimumNumber); return amountToCoinNumber.get(amount); } } |
No comments:
Post a Comment