322.零钱兑换


2019-02-15 18:58:14 by Sikoay with 0 comments 1 Hits
Blog 1

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3 
解释: 11 = 5 + 5 + 1

示例 2:

输入: coins = [2], amount = 3
输出: -1

说明:
你可以认为每种硬币的数量是无限的。

 

import java.util.Arrays;
class Solution {
    public int coinChange(int[] coins, int amount) {
        // 动态规划
        int[] memo = new int[amount + 1];
        Arrays.fill(memo, amount + 1);
        memo[0] = 0;
        for (int i = 1; i <= amount; i++) {
            for (int coin : coins) {
                // i表示当前memo索引
                // memo[i] 表示当前索引的钱 需要的硬币最小个数,如果 memo[i] == amount + 1
                // 表示没有金币的组合能够组成当前的金额
                if (i - coin >= 0) {
                    // 当前索引(钱)所需的最小硬币数,等于
                    // 当前索引初始值(没有组合能组成) 或
                    // 当前memo索引(金币面额),减去当前硬币面值
                    // 此时 memo[i-coin] 的值等于,当前索引面值减去硬币面额之后
                    // 还需要的最小硬币数再加上当前硬币
                    memo[i] = Math.min(memo[i], memo[i - coin] + 1);
                }
            }
        }
        return memo[amount] == amount + 1 ? -1 : memo[amount];
    }
}
 
Tags:

回复 (0)

Leave a Comment