【动态规划】Leetcode 322. 零钱兑换【中等】

零钱兑换

  • 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1

解题思路

这个问题可以使用动态规划来解决

  • 1、我们定义一个长度为 amount+1 的数组 dp,其中 dp[i] 表示凑成金额 i 所需的最少硬币数量。

  •   动态规划的状态转移方程为:
    
  •   dp[i] = min(dp[i], dp[i - coin] + 1),
    
  •  其中 coin 表示硬币的面额,且 coin <= i
    

    这个方程的意思是,如果当前的金额 i 可以由硬币的面额 coin 和金额 i - coin 组成,那么 dp[i] 就可以通过 dp[i - coin] + 1 来更新,即将 coin 加入到凑成金额 i 的硬币组合中。

  • 2、初始化数组dp,长度为amount + 1,全部初始化为amount + 1。

  • 3、设置dp[0]为0,表示凑成金额0所需的最少硬币个数为0。

  • 4、使用循环遍历从1到amount的每个金额i,内层循环遍历硬币数组coins,更新dp[i]为dp[i - coin] + 1和dp[i]中的较小值,其中coin为硬币的面额。

  • 5、如果dp[amount]的值仍然为amount + 1,说明无法凑成总金额,返回-1,否则返回dp[amount]。

java实现

public class CoinChange {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1);dp[0] = 0;for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (coin <= i) {dp[i] = Math.min(dp[i], dp[i - coin] + 1);}}}return dp[amount] > amount ? -1 : dp[amount];}public static void main(String[] args) {CoinChange cc = new CoinChange();int[] coins = {1, 2, 5};int amount = 11;System.out.println("Minimum number of coins: " + cc.coinChange(coins, amount)); // Output: 3 (11 = 5 + 5 + 1)}
}

时间空间复杂度

  • 时间复杂度:外层循环遍历了amount次,内层循环遍历了硬币数组coins,时间复杂度为O(amount * coins.length)。

  • 空间复杂度:使用了长度为amount + 1的数组dp,空间复杂度为O(amount)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署mysql5.7

docker部署mysql5.7 使用docker部署mysql比较方便&#xff0c;适合开发测试使用。 创建文件夹 创建文件夹持久化容器数据&#xff0c;同时映射本地配置文件&#xff0c;方便修改 mkdir -p /home/ubuntu/mysql/datamysql的配置文件如下&#xff1a; [mysqld] # 设置字符集 …

英文阅读~ McDonald‘s buys all 225 of Israeli franchise restaurants after boycotts

McDonald’s buys all 225 of Israeli franchise restaurants after boycotts McDonald’s 是个名字&#xff0c;它买&#xff5e; 遭遇抵制后&#xff0c;麦当劳回购了以色列全部 225 家特许经营餐厅 Israeli ɪzˈreɪli 以色列的&#xff0c;以色列人的 以色列人 boycotts 抵…

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources 最近开发中&#xff0c;出现了在Debug模式下完全正常&#xff0c;打包build后出现插件代码调用提示未实现。 No implementation found for method login on channel app_plugin 经过查找发现在build apk时候出现了混淆的问…

向光而行--那些静悄悄的生命也有光内心有光眼里才有光不要放弃!

人生的每一步路都是有用的&#xff0c;都不会白走 一个人只有内心有光&#xff0c;才能写出有光的文字&#xff0c;活出有光的人生 历史上任何一个伟大的诗人&#xff0c;只…

[沉浸式翻译]最好的网页翻译工具

沉浸式翻译 沉浸式翻译是一种翻译工具&#xff0c;它提供了多种平台的支持&#xff0c;包括桌面端的Edge、Chrome、Firefox、Safari以及移动端的iOS和Android。用户可以在这些平台上安装沉浸式翻译的插件&#xff0c;以便在浏览网页时获得翻译服务。 浏览器的安装教程 详细的…

WEB网站服务器安全漏洞扫描环境搭建及漏洞工具扫描

一、适用环境 1、企业自建有门户网站&#xff1b; 2、使用Struts框架的WEB网站&#xff1b; 3、网站服务器涉及有数据库之类的项目&#xff0c;如&#xff1a;微信登录、手机登录、充值、收费等。 4、使用安卓版、苹果版、电脑版结合的缴费类网站平台。 5、方便但需提高安全性…

排列对称串

Description:很多字串&#xff0c;有些是对称的&#xff0c;有些是不对称的&#xff0c;请将那些对称的字事按从小到大的顺序输出&#xff0c;字事先以长度论大小&#xff0c;如果长度相同&#xff0c;再以ASCI码值为大小标准 Input.输入数据中含有一些字串(1≤串长≤256)。 #…

气膜游泳馆有哪些应用优势呢?-轻空间

气膜游泳馆作为一种利用气膜技术建造的室内体育场馆&#xff0c;具有环保、节能、灵活、美观等特点&#xff0c;适合在各种气候和地形条件下使用。以下是气膜游泳馆具有的应用优势&#xff1a; 1. 全年四季恒温恒湿&#xff1a;气膜游泳馆内部设有智能化的恒温恒湿系统&#xf…

基础环境:wsl2安装Ubuntu22.04 + miniconda

服务器相关信息&#xff1a; Thinkpad p1 gen5 64G 2T 3080ti&#xff0c;自带的有nvidia-smi显卡驱动。使用wsl2安装Ubuntu22.04 miniconda目标&#xff1a;安装gpu版本的PyTorch2.1.2&#xff08;torch2.1.2/cu117 torchvision0.16.2/cu117&#xff09; 处理器 12th Gen I…

ubuntu扩展根目录磁盘空间

ubuntu扩展根目录磁盘空间 扩展虚拟机磁盘空间 查看现有磁盘状态 查询现有分区状态&#xff0c;/dev/sda是我们要扩展的磁盘 fdisk -l 开始进行磁盘空间的扩容 parted /dev/sda#扩展3号分区的空间 resizepart 3刷新分区空间 resize2fs /dev/sda3查询扩展结果&#xff0c;…

Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(一)

在前面的文章中&#xff0c;我们分析了在NIO模式下&#xff0c;服务端接收和读取多个客户端数据的情况&#xff1b; 本文&#xff0c;我们看下NIO模式下&#xff0c;使用Selector如何把数据发送给客户端。 一、直接通过java.nio.channels.SocketChannel#write(java.nio.ByteB…

Linux安装Matlab运行时

一般而言&#xff0c;安装Matlab的linux系统是带桌面版的&#xff0c;如果没带&#xff0c;不在本教程范围内。 一、下载Matlab 下载地址&#xff1a;MATLAB Runtime - MATLAB Compiler - MATLAB 本教程使用R2020b(9.9) 二、linux系统中进行解压 将zip传入linux系统&#xf…

Java23种设计模式-行为型模式之策略模式

策略模式&#xff08;Strategy Pattern&#xff09;&#xff1a;将算法的使用从算法的实现中分离出来&#xff0c;从而让算法的变化不会影响到使用算法的用户。 通常涉及三个角色&#xff1a; 1.上下文&#xff08;Context&#xff09;&#xff1a;持有策略接口的引用&#xf…

EigenLayer生态全解析:再质押与AVS崛起的序章

基于以太坊网络的再质押协议EigenLayer提出了利用为以太坊网络验证而质押的ETH来与其他协议共享安全性和资本效率&#xff0c;同时为协议参与者提供额外利息。在AVS、再质押、积分系统等概念的推动下&#xff0c;逐渐形成一个庞大的生态系统&#xff0c;从2024年初到现在EigenL…

Linux内核驱动开发-001字符设备开发-内核中断驱动独立按键

1驱动程序 /*************************************************************************> File Name: key_enit.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月22日 星期一 20时20分42秒**********************************************…

使用JS代理 实现大对象的功能拆解

序言 在Android开发中&#xff0c;可以通过webView的addJavascriptInterface方法注入一个对象到网页中。但是随着开发的需求越来越多。这个对象身上的方法也越来越多。这个对象对应的java类&#xff0c;体积越来越大&#xff0c;不利于维护。为了在不影响之前代码的基础上。把…

【C++干货基地】深度理解C++中的高效内存管理方式 new delete

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

Golang基础5-指针、结构体、方法、接口

指针 和c/c类似&#xff0c;但是go语言中指针不能进行偏移和运算&#xff0c;安全指针 &&#xff08;取地址) *(根据地址取值) nil(空指针&#xff09; make和new之前对比&#xff1a;make用于初始化slice&#xff0c;map&#xff0c;channel这样的引用类型 而new用于类…

Metasploit Framework(MSF)从入门到实战(一)

MSF的简介 目前最流行、最强大、最具扩展性的渗透测试平台软件 基于Metasploit进行渗透测试和漏洞分析的流程和方法 2003年由HD More发布第一版&#xff0c;2007年用ruby语言重写 架集成了渗透测试标准 (PETS&#xff09; 思想 一定程度上统一了渗透测试和漏洞研究的工作环…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头&#xff0c;短焦镜头看到的视野更广阔&#xff0c;同样距…