leetcode322
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的更多相关文章
- [Swift]LeetCode322. 零钱兑换 | Coin Change
You are given coins of different denominations and a total amount of money amount. Write a function ...
- leetcode322—Coin Change
You are given coins of different denominations and a total amount of money amount. Write a function ...
- Leetcode322. Coin Change零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: coins = ...
- leetcode322 Coin Change
""" You are given coins of different denominations and a total amount of money amount ...
- dp练习--
动态规划(DP)算法 动态规划是运筹学的一个分支,是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局最优解,需要确认原问题与子问题.动态规划状态.边界状态.边界状态 ...
- 动态规划(DP)算法
参考https://blog.csdn.net/libosbo/article/details/80038549 动态规划是求解决策过程最优化的数学方法.利用各个阶段之间的关系,逐个求解,最终求得全局 ...
随机推荐
- LSTM学习—Long Short Term Memory networks
原文链接:https://colah.github.io/posts/2015-08-Understanding-LSTMs/ Understanding LSTM Networks Recurren ...
- 简述servlet
什么是Servlet? Servlet是一种动态的web开发技术,本质就是一个运行在服务端的Java小程序,负责处理业务逻辑,生成动态web内容. 编写一个servlet步骤: 1.编写一个类 继承 ...
- 通过pid杀死进程
bool ****::KillProcess(DWORD pid) { // When the all operation fail this function terminate the " ...
- cmake使用方法详解
cmake 简介 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性 ...
- Linux删除软链接
首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即 ...
- 【leetcode】437. Path Sum III
problem 437. Path Sum III 参考 1. Leetcode_437. Path Sum III; 完
- #20175120彭宇辰 java第五周学习总结
第六章 接口与实现 教材学习内容总结 接口-接口声名interace -接口体1.只有常量声明和抽象方法2.所有常量和方法的访问权限都为public3.常量都为static常量4.可省略pulic\s ...
- 跨源资源共享(CORS)概念、实现(用Spring)、起源介绍
本文内容引用自: https://howtodoinjava.com/spring5/webmvc/spring-mvc-cors-configuration/ https://developer.m ...
- angular6新建项目
mkdir angular6project cd angular6project ng new demo 新建一个普通项目 ng new demo --routing 新建一个带路由的项 ...
- CSS样式补充第二天
#p1{/* border-width: 1px;*/ /*边框实线*/ /*border-style: solid;*/ /*边框虚线*/ ...