这是我自己写的 错误的,边界处理有问题,可以直接看后面的那个。
package LeetCode.OneToFiveHundred;
public class ThreeHundredTwentyTwo {
public int coinChange(int[] coins, int amount) {
if (amount == 0) return 0;
int len = coins.length;
if (amount < coins [0]) return -1;
if (len == 1 && amount % coins[0] != 0) return -1;
int sum = 0;
quickSort(coins,0, len - 1);
for (int i = len - 1; i >= 0; i--){
//边界处理
if (amount == 0) break;
sum += amount / coins[i];
amount %= coins[i];
if (amount == coins[i]) return -1;
}
return sum;
}
public void quickSort(int a[],int l,int r){
if(l>=r)
return;
int i = l; int j = r; int key = a[l];//选择第一个数为key
while(i<j){
while(i<j && a[j]>=key)//从右向左找第一个小于key的值
j--;
if(i<j){
a[i] = a[j];
i++;
}
while(i<j && a[i]<key)//从左向右找第一个大于key的值
i++;
if(i<j){
a[j] = a[i];
j--;
}
}
//i == j
a[i] = key;
quickSort(a, l, i-1);//递归调用
quickSort(a, i+1, r);//递归调用
}
}
public class Solution {
public int coinChange(int[] coins, int amount) {
if (amount < 1) return 0;
return coinChange(coins, amount, new int[amount]);
}
private int coinChange(int[] coins, int rem, int[] count) {
if (rem < 0) return -1;
if (rem == 0) return 0;
if (count[rem - 1] != 0) return count[rem - 1];
int min = Integer.MAX_VALUE;
for (int coin : coins) {
int res = coinChange(coins, rem - coin, count);
if (res >= 0 && res < min)
min = 1 + res;
}
count[rem - 1] = (min == Integer.MAX_VALUE) ? -1 : min;
return count[rem - 1];
}
}
S是面额总值,我们需要知道min所有面额的硬币数,而F(S - C)是最后一枚硬币数量,所以我们要+1