322. Coin Change
Problem 322
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1Input: coins = [2], amount = 3
Output: -1Solution
class Solution:
def coinChange(self, coins, amount):
coins.sort( reverse = True)
lenc, self.min_step = len(coins), float('inf')
def dfs( point, amo , count ):
if not amo: #amount != 0
self.min_step = min( self.min_step, count )
for i in range( point, lenc ):
if coins[i] <= amo < coins[i] * (self.min_step - count):
dfs( i, amo-coins[i], count+1 )
for i in range( lenc ):
dfs( i, amount, 0 )
return [self.min_step, -1][ self.min_step == float('inf') ]class Solution_interative:
def coinChange(self, coins, amount):
coins.sort()
lenc, min_steps = len(coins), float('inf')
dfs_stack = [ (0, 0, lenc) ]
while len(dfs_stack) != 0:
steps, value_now, coins_num = dfs_stack.pop()
if value_now == amount:
min_steps = min( min_steps, steps )
if value_now > amount or amount - value_now > coins[ coins_num-1 ] * (min_steps - steps):
continue
for coinnum, coin in enumerate( coins[:coins_num] ):
dfs_stack.append( (steps+1, value_now + coin, coinnum + 1) )
return min_steps if min_steps != float('inf') else -1Last updated