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. LSTM学习—Long Short Term Memory networks

    原文链接:https://colah.github.io/posts/2015-08-Understanding-LSTMs/ Understanding LSTM Networks Recurren ...

  2. 简述servlet

    什么是Servlet? Servlet是一种动态的web开发技术,本质就是一个运行在服务端的Java小程序,负责处理业务逻辑,生成动态web内容. 编写一个servlet步骤: 1.编写一个类  继承 ...

  3. 通过pid杀死进程

    bool ****::KillProcess(DWORD pid) { // When the all operation fail this function terminate the " ...

  4. cmake使用方法详解

    cmake 简介 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性 ...

  5. Linux删除软链接

    首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即 ...

  6. 【leetcode】437. Path Sum III

    problem 437. Path Sum III 参考 1. Leetcode_437. Path Sum III; 完

  7. #20175120彭宇辰 java第五周学习总结

    第六章 接口与实现 教材学习内容总结 接口-接口声名interace -接口体1.只有常量声明和抽象方法2.所有常量和方法的访问权限都为public3.常量都为static常量4.可省略pulic\s ...

  8. 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍

    本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...

  9. angular6新建项目

    mkdir  angular6project cd angular6project ng new demo      新建一个普通项目 ng new demo --routing  新建一个带路由的项 ...

  10. CSS样式补充第二天

    #p1{/*        border-width: 1px;*/        /*边框实线*/        /*border-style: solid;*/        /*边框虚线*/   ...