题目

coin-change


2. 算法

* dp

* dp优化

* 哈希


3. 代码

* dp

// Non-recursion
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1, amount + 1);
        dp[0] = 0;
        for (int i = 1; i <= amount; ++i) {
            for (int j = 0; j < coins.size(); ++j) {
                if (coins[j] <= i) {
                    dp[i] = min(dp[i], dp[i - coins[j]] + 1);
                }
            }
        }
        return dp[amount] > amount ? -1 : dp[amount];
    }
};

* dp优化

// Recursion
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1, INT_MAX);
        dp[0] = 0;
        return coinChangeDFS(coins, amount, dp);
    }
    int coinChangeDFS(vector<int> &coins, int amount, vector<int> &dp) {
        if (amount < 0) return - 1;
        if (dp[amount] != INT_MAX) return dp[amount];
        for (int i = 0; i < coins.size(); ++i) {
            int tmp = coinChangeDFS(coins, amount - coins[i], dp);
            if (tmp >= 0) dp[amount] = min(dp[amount], tmp + 1);
        }
        return dp[amount] = dp[amount] == INT_MAX ? -1 : dp[amount];
    }
};

* 哈希

// Recursion 
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        unordered_map<int, int> dp;
        dp[0] = 0;
        return coinChangeDFS(coins, amount, dp);
    }
    int coinChangeDFS(vector<int> &coins, int amount, unordered_map<int, int> &dp) {
        if (amount < 0) return - 1;
        if (dp.find(amount) != dp.end()) return dp[amount];
        int cur = INT_MAX;
        for (int i = 0; i < coins.size(); ++i) {
            int tmp = coinChangeDFS(coins, amount - coins[i], dp);
            if (tmp >= 0) cur = min(cur, tmp + 1);
        }
        return dp[amount] = cur == INT_MAX ? -1 : cur;
    }
};

results matching ""

    No results matching ""