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:
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
用最小的硬币数量,达到amount。
最开始的想法是用bfs解决,首先用amount减去所有coins,然后不断遍历。
不过这种方法会超时。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
if amount==0:return 0
res=[amount]
final=0
while res:
final+=1
temp=set()
for amo in res:
for coin in coins:
if amo==coin:
return final
elif amo<coin:
pass
else:
temp.add(amo-coin)
res=temp
return -1
后来看了discuss中的解决方案,并利用visited数组进行过滤。
如果visited==True,说明之前已经可以用更少的硬币数量达到这个amount,所以可以跳过。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
if amount==0:return 0
visited=[False]*(amount+1)
visited[-1]=True
res=[amount]
final=0
while res:
final+=1
temp=[]
for amo in res:
for coin in coins:
namo=amo-coin
if namo==0:
return final
elif namo<0:
continue
elif not visited[namo]:
visited[namo]=True
temp.append(namo)
res=temp
return -1