JavaScript|LeetCode|动态规划|322. 零钱兑换

【hot100-动态规划-322.零钱兑换】 力扣第322题“零钱兑换”要求计算凑成给定总金额所需的最少硬币数。使用动态规划方法,定义 dp[i] 为凑成金额 i 所需的最少硬币数。通过遍历所有硬币面额,更新 dp[i] 的值,状态转移方程为 dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)。最终,若 dp[amount] 不为 Infinity,返回其值,否则返回 -1。时间复杂度为 $O(amount \times n)$,空间复杂度为 $O(amount)$。示例调用展示了代码的正确性。 阅读详情

法1:动态规划
看了题解
想法:

  1. 总金额amount是背包容量
  2. coins是物品(coins.length是物品种类;coins[i]为每种物品的体积)
  3. 每种物品有无限个
  4. 目标:用最少数量的物品把背包填满
/** 
* @param {number[]} coins 
* @param {number} amount 
* @return {number} 
*/
var coinChange = function(coins, amount) {    
    // amount是背包容量    
    // coins是物品(coins.length是物品种类;coins[i]为每种物品的体积)    
    // 每种物品有无限个    
    if(amount == 0) {        
        return 0;    
    }
    var dp = [], i = 0, j = 0;    
    for(j = 0; j <= amount; j++) {        
        dp[j] = 0;    
    }
    
    for(j = 0; j < coins.length; j++) { // 遍历每一个硬币    
        // 对每一个硬币,遍历可以装下它的背包        
        // 硬币不限数量:从小包往大包遍历,可以实现同一面额的硬币的多次加入        
        for(i = coins[j]; i <= amount; i++) {             
            if(i == coins[j]) {                 
                // 正好可以装下                
                dp[i] = 1;            
            }            
            else if(dp[i] == 0 && dp[i - coins[j]] != 0) {                 
                // 容量为i的背包:第一次试着装入                
                dp[i] = dp[i - coins[j]] + 1;            
            }            
            else if(dp[i - coins[j]] != 0) {                 
                // 容量为i的背包:已经装入过,比较两种装入方式,哪种硬币数量更少                
                dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);            
            }        
        }    
    }
    
    if(dp[amount] == 0) {        
        return -1;    
    }    
    else {        
        return dp[amount];    
    }
};
华为面试手撕真题【换零钱】 阅读详情

相关推荐

SRA数据库

简介 序列读取存档(sequence Read Archive,SRA)数据是可通过多个云提供商和NCBI服务器获得的,它是最大的可公开获得的高通量测序数据存储库。 SRA接受来自生活各个部门以及宏基因组学和环境调查的数据。 SRA存储原始测序数据和比对信息,以提高可重复性并通过数据分析促进新发现。 NCBI网站储存二代测序原始数据的数据库 SRA官网 从Entrez搜索结果中下载SRA序列 例如查找SRA Entrez中BALB / c小鼠淋巴结组织的RNA-Seq记录 获取搜索结果 SRA se

qq_44520665的博客 5907

322. 零钱兑换 JavaScript实现

题目链接题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。其实和爬楼梯的思路有点像,总金额就是爬到第几层楼梯。不同的面值数就是依次可以爬一楼或者两楼。但是这里需要取到最少的硬币数量,所以需要遍不同的面值,从而确定最小的数量。dp[i]表示凑足总额为j所需的硬币的最少个数时多少。对于dp[0~i]的每个状态,循环coins数组,寻找可以兑换的组合,用i面额减去当前硬币价值,dp[i-coin]在加上一个硬币数就是dp[i],最后取最小值就是答案dp[i] = Math.min(dp[i], dp[

weixin_43466639的博客 528

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5404

js.零钱兑换

// 一定要加上item

露西西⭐的博客 673

基于深度学习的图像修复系统,GAN图像修复,图像修复算法研究,并实现系统登录和注册,全网独发

近年来,深度学习已成为计算机视觉领域的研究热点,基于深度学习的图像修复技术弥补了传统修复方法长期存在的不足,显著提高了生成结果的质量。深度学习是指模仿人脑机制设计的具有深层结构的神经网络。深度学习作为一种表征学习,通过模仿人脑神经元之间的信息传递方式来学习输入数据的特征,并找到输入和输出数据之间的映射关系。通过在图像修复中应用深度学习技术,可以准确学习图像的语义信息,然后根据信息预测缺失的内容,大大克服了传统修复算法的不足,使结果更具逻辑性。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 8259

嵌入式工程师成长之路(2)——电路设计

为什么你的电源模块总是发热炸机?DC/DC和LDO选型的“潜规则”你踩坑了吗? LM2596降压芯片用错电容导致输出振荡?LED恒流驱动设计让灯珠寿命缩水50%?24V转12V方案成本超预算被老板狂喷?——这些血泪教训,谁能懂得!

云轩阁 13万+

322. 零钱兑换(JavaScript)

322. 零钱兑换(JavaScript)

csD_Dscnnnnnnn的博客 344

14、Java 中 TAF 和 FCF 的使用及 Oracle 数据库升级与迁移指南

本文详细介绍了Java中实现高可用性的TAF(透明应用故障转移)和FCF(快速连接故障转移)技术,以及如何将Oracle 9iR2 RAC环境升级到10gR2 RAC,并将数据从OCFS迁移到ASM。通过示例代码和操作步骤,帮助开发者和数据库管理员更好地应对数据库故障和数据迁移问题,提升系统的可用性和性能。

egg99的博客 109

动态规划:零钱兑换问题(javascript求解)

前言 昨天天面试时突然提到一嘴动态规划,结果面试官问我动态规划是啥子,我竟然一时表达不出来,在这里用自己的话重复在练习一下:动态规划就是先找到大问题的子问题,将子问题的解作为中间结果递推求解最终问题,而且子问题的解要是局部最优的。 动态规划问题的一般解题步骤 确定状态:一般是可以用数组表示状态 化成子问题:涉及到问题的最后一步怎么求解的(比如跳台阶问题的最后一般可以调上一节台阶和跳上2节台阶得到 dp[n] = dp[n-1]+dp[n-2] 初始条件和边界情况需要注意 (设置 dp[0] = 1)

weixin_43342105的博客 952

mojoPortal 路径穿越漏洞复现(CVE-2025-28367)(附脚本)

 在 mojoPortal CMS 版本 <=2.9.0.1 中发现了一个导致 ViewState 反序列化的目录遍历漏洞。通过利用此问题,未经身份验证的攻击者可以泄露 Web 根目录中的敏感文件,包括应用程序的文件。此配置文件包含用于验证和解密 ViewState 数据的文件。知道此密钥后,网络攻击者可以构建恶意 ViewState 有效负载,从而导致在底层服务器上执行远程代码。(CVE-2025-28367)

iSee857的博客 500

数据分析案例-2024年裁员数据集可视化分析

本实验数据集来源于Kaggle,原始数据集为2020-2024年裁员数据,共有3577条,12个变量,该数据集提供了不同公司的裁员信息。它包括以下几栏:Company:裁员发生的公司名称。Location_HQ:公司总部位置。Industry:公司所属的行业或部门。Laid_Off_Count:公司解雇的员工数量。Percentage:公司员工被解雇的百分比。Date:裁员发生的日期。Source:信息来源网址。Funds_Raised:公司募集资金的信息。

m0_64336780的博客 1万+

LeeCode 322-零钱兑换(经典 动态规划)

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

weixin_42445439的博客 1017

高通平台 Android T 蓝牙技术全解析:架构、代码与实现原理

协议栈、配置文件和服务都运行在一个独立的用户空间进程。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 100

【LeetCode练习】322. 零钱兑换(中等|JS|动态规划)

文章目录一、题目描述二、解题思路三、代码实现 一、题目描述 二、解题思路 首先是分治的思想,将大问题转化为小的问题,而在这个过程中,如果用递归,则会产生大量的重复运算,时间复杂度很高。因此用动态规划的思想,找出每一个问题的最优子结构,然后在计算最终问题的时候得出来的也就是最优结构了。 总而言之,动态规划就是为了解决小问题被重复计算得问题。 举个例子: 又1,2,5面值的硬币,组合出5的面值。 首先来看看下图: dp[i]数组用来保存到达第i个值所需要的硬币数量,可以看到如果用普通的递归,会重复计算很多的

JJY的博客 401

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode题解:322. 零钱兑换,动态规划,JavaScript,详细注释

解题思路: 用硬币凑到amount,就是从0元,一直累加到amount元的过程。 我们可以创建一个dp数组,长度是amount + 1,用它的索引表示金额,dp[i]存储的是凑到金额i所需的最小硬币数量。 对于金额i,我们需要把coins中的硬币都试一次,也就是从金额i - coins[j],用1个coins[j]面额的硬币凑过来。 状态转移方程:dp[i] = Math.min(dp[i], dp[i - coin] + 1);。 /** * @param {number[]} coins * @

Lee Chen的博客 296

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Leetcode 322. 零钱兑换 (Day 29) JavaScript

【代码】Leetcode 322. 零钱兑换 (Day 29) JavaScript。

Loving CS ~ 42

JavaScript / TypeScript for LeetCode (九十二)

是差点运气,可我一直在努力! 当前进程: 开始时间:2020.6.27 结束时间:undefined GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode 1、题目要求 ( LeetCode-第322题 ) 零钱兑换 2、解题思路 方法:动态规划 类似70. 爬楼梯 状态:dp[i] -- 达到第i级台阶所需的最少跳跃次数 状态转移方程:dp[i] = min(dp[当前台阶i - 可选择的单次跳跃台阶

weixin_47771057的博客 124

leetcode 322 零钱兑换 JavaScript

leetcode 322 零钱兑换 JavaScript 思路:dp解法(因为最近都在练dp) 首先dp[i]=n表示总金额为i时,需要的硬币个数为n,我们假设coin为coins的某个数,也就是某个面值的硬币 那么对于取硬币会有一个非常明显的特点,也就是取出一颗少一颗 这个特点对于理解dp[i]=min(dp[i],dp[i-coin]+1)非常关键 为什么是dp[i-coin]+1呢 假设目标金额为10,当你要取一个面值为2的硬币,那么剩下的硬币要凑齐8 所以dp[10]=1+dp[8], 其中1代表

weixin_44013946的博客 644

Leetcode 147 零钱兑换 | 单词拆分

i++ ){

im_AMBER的博客 517

【leetcode】322 零钱兑换(动态规划)

题目链接:https://leetcode-cn.com/problems/coin-change/ 题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5...

zjwreal 966

Leetcode—— 322. 零钱兑换

322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 示例1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出...

suxiaorui的博客 467

LeetCode322 零钱兑换

LeetCode322 零钱兑换题目解题解题一:记忆化搜索解题二:动态规划 题目 解题 解题一:记忆化搜索 在上面的递归树中,许多子问题被多次计算。例如,F(1) 被计算了 13 次。为了避免重复的计算,将每个子问题的答案存在一个哈希表中进行记忆化,如果下次还要计算这个值直接取出返回即可,保证每个子问题最多只被计算一次。 因为 coins 是 整数数组,也可以用数组来进行记忆;如果存在小数,只能用哈希表来记忆。 var coinChange = function(coins, amount) {

180

322. 零钱兑换

题干 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: ...

QAQ123666的博客 388

Leetcode 322.零钱兑换

Time: 20190906 Type: Medium 题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = ...

Bing's Blog 506

LeetCode 322. 零钱兑换(Medium)/ 零钱兑换2(Medium)

题目链接 题解 零钱兑换 思路 代码 class Solution: ### 0124 递归(1104 ms,50.2 MB) def coinChange(self, coins: List[int], amount: int) -> int: # 注意:需要增加lru_cache装饰器,实现记忆化缓存 @functools.lru_cache(amount) def dfs(remain): if .

newCraftsman的博客 271

322 零钱兑换(2021-07-22)

322. 零钱兑换 链接:https://leetcode-cn.com/problems/coin-change/ 感想 看了半天题解,才理解。估计过一个月再来做,还是做不出来,我一定是个废物。 解法1:动态规划 (1)第一步:定义数组元素的含义 用一个一维数组来表示当前构成i的面额,最小需要多少枚硬币 (2)第二步:找出数组元素之间的关系式 dp[i] = min(dp[i], dp[i - conis[j]] + 1) 这个动态规划方程不太好想,当前dp[i],枚举的最后一枚硬币的面值是coin

多啦的博客 258
上一篇: [flask框架]下:前端发起请求,服务器用[python]读取[本地图片]并转码[base64],传至前端显示
下一篇: JavaScript|LeetCode|动态规划|518. 零钱兑换 II
J_learner
博客等级 码龄8年 2粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值