LeetCode——322.零钱兑换(Java)

这是我自己写的 错误的,边界处理有问题,可以直接看后面的那个。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值