Java实现如下:

public class Solution {
public int coinChange(int[] coins, int amount) {
if (amount == ) return ;
int[] dp = new int[amount + ];
dp[] = ;
for (int i = ;i <= amount ;i++ ) {
dp[i] = Integer.MAX_VALUE;
for(int k :coins) {
if(i>=k && dp[i-k] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i-k] + ,dp[i]);
}
}
}
if(dp[amount]<Integer.MAX_VALUE && dp[amount] > ) {
return dp[amount];
} else {
return -;
} }
}

补充一个python的实现:

 import sys
class Solution:
def coinChange(self, coins: 'List[int]', amount: int) -> int:
dp = [sys.maxsize for i in range(amount+)]
dp[] =
for i in range(,amount+):
for k in coins:
if i >= k and dp[i-k] != sys.maxsize:
dp[i] = min(dp[i],dp[i-k]+) return - if dp[amount] == sys.maxsize else dp[amount]

注意内层循环范围是coins,而不要使用range(amount+1),否则会TLE。DP方案执行时间:1700ms。

补充另一种解法,BFS + memo,效率要高一些,执行时间:1000ms。

 class Solution:
def coinChange(self, coins: 'List[int]', amount: int) -> int:
n = len(coins)
if amount == :
return
target = {amount}
memo = set()
level =
result = amount +
while target:
cur = set()
for t in target:
if t not in memo:
memo.add(t)
for c in coins:
if t - c == :
result = min(result,level + )
#return level +
if t - c > :
cur.add(t - c)
target = cur
level +=
return - if result > amount else result

思路,使用memo记录已经“扩展”的节点,之后再遇到同样数值的节点,就不再扩展了(二叉树剪枝)。

target中存储当前层的节点,cur记录下一层的节点。

注意第16行,t - c == 0时,说明发现一种可以满足要求的方案,此时记录当前树的高度,并更新result。result中保存全局最小的满足条件的树的高度值。

leetcode322的更多相关文章

  1. [Swift]LeetCode322. 零钱兑换 | Coin Change

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  2. leetcode322—Coin Change

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  3. Leetcode322. Coin Change零钱兑换

    给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = ...

  4. leetcode322 Coin Change

    """ You are given coins of different denominations and a total amount of money amount ...

  5. dp练习--

    动态规划(DP)算法     动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局最优解,需要确认原问题与子问题.动态规划状态.边界状态.边界状态 ...

  6. 动态规划(DP)算法

    参考https://blog.csdn.net/libosbo/article/details/80038549 动态规划是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局 ...

随机推荐

  1. itextsharp报错PdfReader not opened with owner password

    itextSharp读取Pdf时报错:PdfReader not opened with owner password 报错原因:pdf文件被用户加密了. 解决办法:在创建pdfReader实例后,加 ...

  2. s21day07 python笔记

    s21day07 python笔记 一.昨日内容回顾及补充 回顾 补充 将前面所提到的功能,统一改称为方法 二.深浅拷贝 基本格式 v1 = [1,2,3] import copy v2 = copy ...

  3. Vue遇到的问题

      1.<a v-bind:[attributeName]="url"> ... </a> 报错,原因 attributeName应该属于关键字,不能用 2 ...

  4. Maven用途

    1.使用Maven编译项目,命令是:“mvncompile” 在命令行中,进入pom.xml所在目录,输入命令即可. 2.使用Maven清理项目,命令是:“mvnclean” 3.使用Maven测试项 ...

  5. asp.net服务器控件button先执行js再执行后台的方法

    服务器控件增强了在后台处理的能力,但是在前台有时候也被受到了限制. 关于button这个服务器控件,我一直想减少它向服务器提交数据.那些检测,还是在客户端实现就好了.这就需要javascript,但是 ...

  6. 安装httpd服务

    1.yum安装httpd服务 2.启动httpd服务端口被占用 3.修改端口 4.启动httpd服务 5.输入网址是否正常能访问

  7. web前端3.0时代,“程序猿”如何“渡劫升仙”?

    世界上目前已经有超过18亿的网站.其中只有不到2亿的网站是活跃的.且每天都有几千个新网站不断被创造出来. 2017年成果显著,网络上出现了像Vue这样的新JavaScript框架:基于用户体验流程的开 ...

  8. 在 delphiXE 10.2 上安装 FR5.4.6

    今天在虚拟机里成功安装了delphiXE 10.2, 然后想把常用的FR也装上,本想偷个懒,在网上找个装上就得了,结果发现必须要在发布的网站注册才能下载⊙︿⊙ 如此麻烦,心里这个不爽啊不爽! 然后自己 ...

  9. 关于STL容器

    容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...

  10. 文件处理,三元操作符,seek()函数,迭代函数和列表解析,reduce函数

    1.文件读取方类型 r,r+,w,x,a, r,读文件 w,写文件,文件内容全部删除,并将新内容从第一行开始赋值 x,写文件,只有文件不存在,可写,文件存在,报错 a,在文件莫问追加信息 r+,w+, ...