leetCode 322.零钱兑换 完全背包 + 动态规划 + 记忆化搜索 + 递推 + 空间优化 + 画递归树

关于此题我的往期文章LeetCode 322.零钱兑换 完全背包 + 动态规划_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://heheda.blog.csdn.net/article/details/133386579看本期文章时,可以先回顾一下动态规划入门知识完全背包理论和实战

0-1背包 完全背包 + 至多/恰好/至少 + 空间优化 + 常见变形题(实战力扣题)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134210521?spm=1001.2014.3001.5501leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_41987016/article/details/134179583?spm=1001.2014.3001.5501给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的


最优的子结构性质,这是解决动态规划问题的关键。最优解可以从其子问题的最优解构造出来。如何将问题分解成子问题?

(1)递归

class Solution {
public:int coinChange(vector<int>& coins, int amount) {int n = coins.size();function<int(int,int)> dfs=[&](int i,int c) -> int {if(i < 0) {if(c == 0) return 0;else return INT_MAX/2;// 除 2 是防止下面 + 1 溢出}if(c < coins[i]) return dfs(i-1,c);return min(dfs(i-1,c),dfs(i,c-coins[i])+1);     };int ans = dfs(n-1,amount);return ans<INT_MAX/2?ans:-1;}
};

在上面的递归树中,可以看到有许多子问题被多次计算。例如,F(1)被计算了13次。为了避免重复的计算,可以将每个子问题的答案存在一个数组中进行记忆化,如果下次还要计算这个问题的值直接从数组中取出返回即可,这样能保证每个子问题最多只被计算一次。我们接着往下看~

(2)递归搜索 + 保存计算结果 = 记忆化搜索

class Solution {
public:// 记忆化搜索int coinChange(vector<int>& coins, int amount) {int n = coins.size(),memo[n+1][amount+1];memset(memo,-1,sizeof(memo));function<int(int,int)> dfs=[&](int i,int c) -> int {if(i < 0) {if(c == 0) return 0;else return INT_MAX/2;// 除 2 是防止下面 + 1 溢出}int& res = memo[i][c];if(res != -1) return res;if(c < coins[i]) return res=dfs(i-1,c);return res=min(dfs(i-1,c),dfs(i,c-coins[i])+1);     };int ans = dfs(n-1,amount);return ans<INT_MAX/2?ans:-1;}
};

  • 时间复杂度:O(n * amount)
  • 空间复杂度:O(n * amount)

(3)1:1 翻译成递推

class Solution {
public:// 1:1 翻译成递推int coinChange(vector<int>& coins, int amount) {int n = coins.size(),f[n+1][amount+1];memset(f,0x3f,sizeof(f));f[0][0]=0;for(int i=0;i<n;i++) {for(int c=0;c<=amount;c++) {if(c<coins[i]) f[i+1][c] = f[i][c];else f[i+1][c] = min(f[i][c],f[i+1][c-coins[i]]+1); }}int ans = f[n][amount];return ans<0x3f3f3f3f?ans:-1;}
};
  • 时间复杂度:O(n * amount)
  • 空间复杂度:O(n * amount)

 (4)空间优化:两个数组(滚动数组)

class Solution {
public:// 空间优化:两个数组(滚动数组)int coinChange(vector<int>& coins, int amount) {int n = coins.size(),f[2][amount+1];memset(f,0x3f,sizeof(f));f[0][0]=0;for(int i=0;i<n;i++) {for(int c=0;c<=amount;c++) {if(c<coins[i]) f[(i+1)%2][c] = f[i%2][c];else f[(i+1)%2][c] = min(f[i%2][c],f[(i+1)%2][c-coins[i]]+1); }}int ans = f[n%2][amount];return ans<0x3f3f3f3f?ans:-1;}
};
  • 时间复杂度:O(n * amount)
  • 空间复杂度:O(amount)

(5)空间优化:一个数组

class Solution {
public:// 空间优化:两个数组(滚动数组)int coinChange(vector<int>& coins, int amount) {int n = coins.size(),f[amount+1];memset(f,0x3f,sizeof(f));f[0]=0;for(int i=0;i<n;i++) {for(int c=coins[i];c<=amount;c++) {f[c] = min(f[c],f[c-coins[i]]+1); }}int ans = f[amount];return ans<0x3f3f3f3f?ans:-1;}
};
  • 时间复杂度:O(n * amount)
  • 空间复杂度:O(amount)

参考和推荐文章:
322. 零钱兑换 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/coin-change/solutions/132979/322-ling-qian-dui-huan-by-leetcode-solution/

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

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

相关文章

面试算法50:向下的路径节点值之和

题目 给定一棵二叉树和一个值sum&#xff0c;求二叉树中节点值之和等于sum的路径的数目。路径的定义为二叉树中顺着指向子节点的指针向下移动所经过的节点&#xff0c;但不一定从根节点开始&#xff0c;也不一定到叶节点结束。例如&#xff0c;在如图8.5所示中的二叉树中有两条…

Nodejs和npm的使用方法和教程

Nodejs简介 Node.js 是一个开源和跨平台的 JavaScript 运行时环境。 它几乎是任何类型项目的流行工具&#xff01; &#xff08; 运行环境&#xff0c;是不是很熟悉&#xff0c;对。就是 java JRE&#xff0c;Java 运行时环境&#xff09; Node.js 在浏览器之外运行 V8 Java…

WSL 下载

可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符&#xff0c;方法是右键单击并选择“以管理员身份运行”&#xff0c;输入 wsl --install 命令&#xff0c;然后重启计算机。 首先查看可以下载的版本 最后再运行wsl --ins…

企业电脑屏幕监控有哪些?如何实现电脑屏幕监控

企业电脑屏幕监控有哪些&#xff1f;如何实现电脑屏幕监控 下载使用安企神电脑屏幕监控软件 企业电脑屏幕监控是一种监测和记录员工在工作时间内在他们的计算机上执行的活动的技术。这种监控可以有多种目的&#xff0c;包括确保员工的生产力、确保数据安全性&#xff0c;或满…

【总】HEC-RAS学习记录

【总】HEC-RAS学习记录 目标HEC-RAS简介和下载渠道简介下载渠道指导教程 目标 为了进行溃坝模拟&#xff0c;了解了很多软件&#xff0c;最终决定使用HEC-RAS HEC-RAS简介和下载渠道 简介 HEC-RAS 是美国陆军工程兵团工程水文中心&#xff08;HEC&#xff09;开发的河道水力…

【Qt-22】Qt乱码问题解决

最近在Qt项目中遇到TCP通信接收数据乱码的问题&#xff0c;很是苦恼&#xff0c;经过多次尝试&#xff0c;终于得以解决。 感谢Qt TcpSocket 传递数据乱码显示_qt中socket接受到的客户端数据显示不出来-CSDN博客 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)_XX風的博客…

编程新手的犯错之路

第1名&#xff1a;无尽的if-else陷阱 在我刚刚学习编程的时候&#xff0c;我对if-else语句的使用充满了好奇。我曾经写下了这样一个愚蠢的代码块&#xff0c;用来判断一个数字属于哪个范围&#xff1a; if (number > 1 && number < 10) {// 做一些事情 } else …

Open3D(C++) 最小二乘拟合平面(间接平差法)

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 1、原理概述 通过传统最小二乘法对点云数据进行平面拟合时,可将误差只归因于一个方向上,本文假设误差只存在于 Z Z

Spring源码编译步骤

Spring源码学习 一、Gradle 为什么下载gradle呢&#xff1f;我们平时不都是用maven吗&#xff1f;原因只有一个&#xff0c;spring源码是用gradle构建的&#xff0c;所以&#xff0c;你想看spring源码必须安装和学会使用gradle&#xff0c;那么&#xff0c;让我们开始gradle之…

[elastic 8.x]java客户端连接elasticsearch与操作索引与文档

初始化客户端 引入相关依赖 <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.10.2</version> </dependency>初始化客户端 为了方便演示&#xff0c;我关闭了ela…

微信小程序提示确认框 wx.showModal

核心实现代码如下 wx.showModal({ title: 确认, content: 确定要删除吗&#xff1f;, success (res) { if (res.confirm) { console.log(用户点击确定) } else if (res.cancel) { console.log(用户点击取消) } } })title 是确认框的标题&#xff0c;content 是确认…

GNSS精密解算软件介绍

GAMIT&#xff1a; 美国麻省理工学院&#xff08;MIT&#xff09;和加州大学圣地亚哥分校的海洋研究所&#xff08;SIO&#xff09;开发的GAMIT/GLOBK软件&#xff0c; GAMIT为双差网解&#xff0c;利用双差直接消除卫星及测站的时间误差。 gamit软件介绍-周命端&#xff1a;…

存储过程触发器

存储过程&#xff1a;存储过程是一组预编译的SQL语句&#xff0c;可以在数据库中存储并重复使用。存储过程可以提高性能、减少网络流量并提高安全性。MSSQL中的存储过程使用T-SQL编写。 触发器&#xff1a;触发器是一种特殊类型的存储过程&#xff0c;它会在数据库中执行某个操…

es-并发写入报错及解决

一、现象报错日志 VersionConflictEngineException[[XXX][1234]: version conflict, current version [2 问题产生背景 众所周知&#xff0c;es经常被用于存储日志数据&#xff0c;其中在某些场景下&#xff0c;日志产生的时机不同&#xff0c;并且需要将多类具备关联关系的日…

shell综合项目

主菜单 http和Nginx分别的install的菜单&#xff0c;安装过程通过重定向到/dev/null达到看不见的效果 输入非整数或者大于4的数字都会提示错误 代码如下: [rootserver ~]# vim install_menu.sh #!/bin/bash function menu() { cat << EOF …

变更数据捕获 (CDC) 的七种使用方法

变更数据捕获 (CDC) 是数据工程中的强大工具&#xff0c;在过去几年中在各种组织中得到了巨大的应用。这是因为它能够以非常低的延迟将事务数据库紧密集成到您企业中的许多其他系统中。 CDC 对事务数据库中发生的更改&#xff08;例如插入、更新和删除&#xff09;做出响应&am…

前端小案例 | 喵喵大王立大功 | 一个带便利贴功能的todolist面板

文章目录 &#x1f4da;html&#x1f4da;css&#x1f4da;js&#x1f407;stickynote.js&#x1f407;todolist.js&#x1f407;clock.js &#x1f4da;html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…

配置Raspberry自动连接WIFI,在无法查看路由器的校园网情况下使用自己电脑热点

1、开启电脑热点&#xff0c;并共享电脑WLAN2 打开控制面板->网络和Internet->网络连接 选择自己的校园网&#xff0c;我这里是WLAN2&#xff0c;右键属性&#xff0c;如下操作&#xff1a; 如果没有看到 本地连接*10类似的图标 则按如下操作&#xff1a;winx键&#x…

文本内容转换成语音播放的工具:Speech Mac

Speech Mac版是一款适用于Mac电脑的语音合成工具。它将macOS语音合成器的所有功能整合到一个易于使用的界面中。通过Speech Mac版&#xff0c;用户可以选择40多种声音和语言&#xff0c;方便地将文本转换为语音。用户可以将文本拖放或粘贴到Speech中&#xff0c;并随时更改语音…

Linux安装配置awscli命令行接口工具及其从aws上传下载数据

官网技术文档有全面介绍&#xff1a;安装或更新 AWS CLI 的最新版本 - AWS Command Line Interface在系统上安装 AWS CLI。https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructionsawscli常用命令参考&…