Skip to content

Prepare For Coder Interview – Denny

  • Basic
  • Medium
  • Hard
  • Architect
  • Life

LeetCode: Coin Change

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

Coin Change



Similar Problems:

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

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:

coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:

coins = [2], amount = 3
return -1.

Note:
You may assume that you have an infinite number of each kind of coin.

Github: code.dennyzhang.com

Credits To: leetcode.com

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


## https://code.dennyzhang.com/coin-change
class Solution(object):
    ## Basic Ideas: Dynamic Programming
    ##
    ##    dp(i) = min(dp(i), dp[i-coin[j]]+1)
    ## Complexity: Time O(n), Space O(n)
    def coinChange(self, coins, amount):
        """
        :type coins: List[int]
        :type amount: int
        :rtype: int
        """
        if amount == 0: return 0
        import sys
        coins.sort()
        dp = [0] + [sys.maxsize]*(amount)

        for i in range(1, amount+1):
            for coin in coins:
                if coin > i: break
                if dp[i-coin] != sys.maxsize:
                    dp[i] = min(dp[i], dp[i-coin]+1)

        return dp[amount] if dp[amount] != sys.maxsize else -1 

    ## Basic Ideas: BFS
    ##
    ## Complexity: Time O(n), Space O(n)
    def coinChange_v1(self, coins, amount):
        """
        :type coins: List[int]
        :type amount: int
        :rtype: int
        """
        if amount == 0: return 0
        coins.sort()
        d = {}
        queue = collections.deque()
        queue.append(0)
        level = 0
        while len(queue) != 0:
            level += 1
            for k in range(len(queue)):
                num = queue.popleft()
                for coin in coins:
                    v = coin + num
                    if v > amount: break
                    if v == amount: return level
                    # avoid duplicate
                    if v not in d:
                        d[v] = level
                        queue.append(v)
        return -1
linkedin
github
slack

Post Views: 11
Posted in BasicTagged #bfs, #classic, coin, knapsack

Post navigation

LeetCode: Word Break
LeetCode: Coin Change 2

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.