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. JavaScript的组成 | DOM/BOM

    往期回顾 在上一期的<JavaScript的组成 | 核心-ECMAScript >☜里,我们有说到JavaScript 是由三大部分组成,分别是:核心ECMAScript.文档对象模型- ...

  2. 51单片机数据类型int,float,指针所占字节数

    1.int===2个字节 2.sfr===特殊功能寄存器,也是一种扩充数据类型,占用1个内存单元,利用它可以访问51单片机内的所有特殊功能寄存器. sfr P1 = 0x90;/////////这一句 ...

  3. 使用pip命令自动生成项目安装依赖清单

    Python项目中经常会带requirements.txt文件,里面是项目所依赖的包的列表,也就是依赖关系清单,这个清单也可以使用pip命令自动生成. pip命令: 1 pip freeze > ...

  4. 2017《JAVA技术》预备作业2-计科1502-19-何俏依

    Git学习笔记 1.安装git并验证安装成功 2.注册码云账号并配置git 3.创建ssh key并在码云上添加公钥,验证公钥添加成功 添加公钥的过程中,出现了一些问题,未找到文件,经过老师的指点,仔 ...

  5. 阻塞队列 BlockingQueue 详解

    转自:https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247487078&idx=2&sn=315f39b6d53 ...

  6. 【java多线程】队列系统之LinkedBlockingDeque源码

    1.简介 上一篇我们介绍了 LinkedBlockingDeque 的兄弟篇 LinkedBlockingQueue .听名字也知道一个实现了 Queue 接口,一个实现了 Deque 接口,由于 D ...

  7. oracle错误汇总1

    这是遇见的第一个整个库正常,但某张表查询报错的情况 某张表数据可以查,但一排序查就报错 select * from acct_daily_bak; select * from acct_daily_b ...

  8. django基础 -- 10.form , ModelForm ,modelformset

    一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...

  9. spring中@Value("${key}")值原样输出${key}分析与解决

    问题: 最近发现一个项目中,在类中通过@Value("${key}")获取配置文件中变量值突然不行了,直接输出${key},示例代码如下: java类中: import org.s ...

  10. 分享一个生成反遗忘复习计划的java程序

    想必这个曲线大家都认识,这是遗忘曲线,展示人的记忆会随着时间的延长慢慢遗忘的规律,同时还展示了如果我们过一段时间复习一次对遗忘的有利影响. 道理大家都懂,关键怎么做到? 靠在本子上记下今天我该复习哪一 ...