Skip to content

Prepare For Coder Interview – Denny

  • Basic
  • Medium
  • Hard
  • Architect
  • Life

LeetCode: Coin Change 2

Posted on February 27, 2018July 26, 2020 by braindenny

Coin Change 2



Similar Problems:

  • Coin Change
  • CheatSheet: Leetcode For Code Interview
  • CheatSheet: Common Code Problems & Follow-ups
  • Tag: #knapsack, #coin

You are given coins of different denominations and a total amount of money. Write a function to compute the number of combinations that make up that amount. You may assume that you have infinite number of each kind of coin.

Note: You can assume that

  • 0 <= amount <= 5000
  • 1 <= coin <= 5000
  • the number of coins is less than 500
  • the answer is guaranteed to fit into signed 32-bit integer

Example 1:

Input: amount = 5, coins = [1, 2, 5]
Output: 4
Explanation: there are four ways to make up the amount:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

Example 2:

Input: amount = 3, coins = [2]
Output: 0
Explanation: the amount of 3 cannot be made up just with coins of 2.

Example 3:

Input: amount = 10, coins = [10] 
Output: 1

Github: code.dennyzhang.com

Credits To: leetcode.com

Leave me comments, if you have better ways to solve.


## https://code.dennyzhang.com/coin-change-2
class Solution(object):
    ## Basic Ideas: Dynamic programming
    ##   dp(i) = {coin1: count1, coin2: count2, coin3: count3, ...}
    ##           count_j is the combination with the maximum value as coin_j
    ##
    ## Complexity: Time O(k*n), Space O(n)
    def change(self, amount, coins):
        """
        :type amount: int
        :type coins: List[int]
        :rtype: int
        """
        if amount == 0: return 1
        if len(coins) == 0: return 0
        dp = [None]*(1+amount)
        for i in range(0, amount+1): dp[i] = collections.defaultdict(lambda: 0)
        for coin in coins: dp[0][coin] = 1
        coins.sort()
        for i in range(1, amount+1):
            for coin in coins:
                if i<coin: break
                v = i-coin
                dp[i][coin] = dp[v][coin]

            dp[i][0] = 1
            for j in range(1, len(coins)):
                dp[i][coins[j]] += dp[i][coins[j-1]]

        return dp[amount][coins[-1]]
linkedin
github
slack

Post Views: 4
Posted in MediumTagged #classic, coin, knapsack

Post navigation

LeetCode: Coin Change
LeetCode: Base 7

Leave a Reply Cancel reply

Your email address will not be published.

Tags

#array #backtracking #bfs #binarytree #bitmanipulation #blog #classic #codetemplate #combination #dfs #dynamicprogramming #game #graph #greedy #heap #inspiring #interval #linkedlist #manydetails #math #palindrome #recursive #slidingwindow #stack #string #subarray #trie #twopointer #twosum binarysearch editdistance hashmap intervaldp knapsack monotone oodesign presum rectangle redo review rotatelist series sql treetraversal unionfind

Recent Posts

  • a
  • a
  • a
  • a
  • a

Recent Comments

    Archives

    Categories

    • Amusing
    • Basic
    • Easy
    • Hard
    • Life
    • Medium
    • Resource
    • Review
    • Series
    • Uncategorized
    Proudly powered by WordPress | Theme: petals by Aurorum.