leetCode 494. 目标和 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

关于本题我的往期文章:

LeetCode 494.目标和 (动态规划 + 性能优化)二维数组 压缩成 一维数组_呵呵哒( ̄▽ ̄)"的博客-CSDN博客icon-default.png?t=N7T8https://heheda.blog.csdn.net/article/details/133253822


给你一个非负整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

  • 例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。

返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。


(1)递归 

class Solution {
public:// 递归int findTargetSumWays(vector<int>& nums, int target) {int sum=0,n=nums.size();for(const int & x:nums) sum+=x;if (abs(target) > sum) return 0; // 此时没有方案if ((sum + target) % 2 == 1) return 0; // 此时没有方案if ((sum + target) % 2 == 1) return 0; // 此时没有方案int addTarget = (sum + target) / 2;function<int(int,int)> dfs = [&](int i,int c) -> int {if(i<0) return c==0 ? 1 : 0;// 边界条件:由于要求是恰好组成。恰好情况:当c=0的时候,才能返回1,表示这是一个合法的方案if(c-nums[i]<0) return dfs(i-1,c);return dfs(i-1,c) + dfs(i-1,c-nums[i]);};return dfs(n-1,addTarget);}
};

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

class Solution {
public:// 记忆化搜索int findTargetSumWays(vector<int>& nums, int target) {int sum=0,n=nums.size();for(const int & x:nums) sum+=x;if (abs(target) > sum) return 0; // 此时没有方案if ((sum + target) % 2 == 1) return 0; // 此时没有方案int addTarget = (sum + target) / 2;vector<vector<int>> memo(n+1,vector<int>(addTarget+1,-1));function<int(int,int)> dfs = [&](int i,int c) -> int {if(i<0) return c==0 ? 1 : 0;int &res = memo[i][c];if(res != -1) return res;if(c-nums[i]<0) return res=dfs(i-1,c);return res=dfs(i-1,c) + dfs(i-1,c-nums[i]);};return dfs(n-1,addTarget);}
};

(3)1:1 翻译递推

  • dfs(i,c) = dfs(i-1,c) + dfs(i-1,c-w[i])
  • f[i][c] = f[i-1][c] + f[i-1][c-w[i]]
  • f[i+1][c] = f[i][c] + f[i][c-w[i]]

初始化:根据 if(i<0) return c==0 ? 1 : 0; 

  • f 数组初始化为 0
  • dfs(-1,0) = 1 翻译f[0][0]=1

返回最终结果:根据 dfs(n-1,addTarget) 翻译 f[n][addTarget] 

class Solution {
public:// 递推式int findTargetSumWays(vector<int>& nums, int target) {int sum=0,n=nums.size();for(const int & x:nums) sum+=x;if (abs(target) > sum) return 0; // 此时没有方案if ((sum + target) % 2 == 1) return 0; // 此时没有方案int addTarget = (sum + target) / 2;vector<vector<int>> f(n+1,vector<int>(addTarget+1,0));f[0][0]=1;for(int i=0;i<n;i++) {for(int c=0;c<=addTarget;c++) {if(c-nums[i]<0) f[i+1][c]=f[i][c];else f[i+1][c]=f[i][c] + f[i][c-nums[i]];}}return f[n][addTarget];}
};

  • 优化空间

方式一:二维数组优化

  • f[(i+1)%2][c]=f[i%2][c] + f[i%2][c-nums[i]];
class Solution {
public:// 递推式 + 优化空间int findTargetSumWays(vector<int>& nums, int target) {int sum=0,n=nums.size();for(const int & x:nums) sum+=x;if (abs(target) > sum) return 0; // 此时没有方案if ((sum + target) % 2 == 1) return 0; // 此时没有方案int addTarget = (sum + target) / 2;vector<vector<int>> f(2,vector<int>(addTarget+1,0));f[0][0]=1;for(int i=0;i<n;i++) {for(int c=0;c<=addTarget;c++) {if(c-nums[i]<0) f[(i+1)%2][c]=f[i%2][c];else f[(i+1)%2][c]=f[i%2][c] + f[i%2][c-nums[i]];}}return f[n%2][addTarget];}
};

方式二:一维数组优化

  • f[i+1][c]=f[i][c] + f[i][c-nums[i]];
  • f[c]=f[c] + f[c-nums[i]];
class Solution {
public:// 递推式 + 优化空间int findTargetSumWays(vector<int>& nums, int target) {int sum=0,n=nums.size();for(const int & x:nums) sum+=x;if (abs(target) > sum) return 0; // 此时没有方案if ((sum + target) % 2 == 1) return 0; // 此时没有方案int addTarget = (sum + target) / 2;vector<int>f(addTarget+1,0);f[0]=1;for(int i=0;i<n;i++) {for(int c=addTarget;c>=nums[i];c--) {f[c]=f[c] + f[c-nums[i]];}}return f[addTarget];}
};// 也可以写成这样
for(const int& x:nums) {for(int c=addTarget;c>=x;c--) {f[c]=f[c] + f[c-x];}
}

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

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

相关文章

mysql:B+树/事务

B树 : 为了数据库量身定做的数据结构 我们当前这里的讨论都是围绕 mysql 的 innodb 这个存储引擎来讨论的 其他存储引擎可能会用到hash 作为索引,此时就只能应对这种精准匹配的情况了 要了解 B树 我们先了解 B树, B树 是 B树 的改进 B树 有时候会写作 B-树 (这里的" -…

axios 实现请求重试

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 请求重试的核心是可以重放请求&#xff0c;具体实现就是在 axios 中&#xff0c;拿到当前请求的 config 对象&#xff0c;再用 axios 实例&#xff0c;就能重放请求。 在无感刷新…

【WinForm详细教程七】WinForm中的DataGridView控件

文章目录 1.主要属性DataSource行&#xff08;Row 相关属性&#xff09;列&#xff08;Column 相关属性&#xff09;单元格&#xff08;Cell 相关属性&#xff09;逻辑删除AllowUserToAddRowsAllowUserToDeleteRowsAllowUserToOrderColumns其他布局和行为属性 2.控件中的行、列…

PHP foreach 循环跳过本次循环

$a [[id>1],[id>2],[id>3],[id>4],[id>5],[id>6],[id>7],[id>18],];foreach($a as $v){if($v[id] 5){continue;}$b[] $v[id];}return show_data(,$b); 结果&#xff1a;

ASTM F963-23美国玩具安全新标准发布

新标准发布 2023年10月13日&#xff0c;美国材料与试验协会&#xff08;ASTM&#xff09;发布了新版玩具安全标准ASTM F963-23。 主要更新内容 与ASTM F963-17相比&#xff0c;此次更新包括&#xff1a;单独描述了基材重金属元素的豁免情况&#xff0c;更新了邻苯二甲酸酯的管控…

上班族必备:制作电子宣传册的网站

​对于上班族来说&#xff0c;制作电子宣传册是一项非常重要的技能。因为宣传册是展示公司形象、产品特点、服务优势的重要工具&#xff0c;也是与客户沟通交流的重要手段。那么&#xff0c;如何制作一份高质量的电子宣传册呢&#xff1f;今天就为大家推荐几个制作电子宣传册的…

如何让 Bean 深度感知 Spring 容器

Spring 有一个特点&#xff0c;就是创建出来的 Bean 对容器是无感的&#xff0c;一个 Bean 是怎么样被容器从一个 Class 整成一个 Bean 的&#xff0c;对于 Bean 本身来说是不知道的&#xff0c;当然也不需要知道&#xff0c;也就是 Bean 对容器的存在是无感的。 但是有时候我…

【ChatGLM2-6B】P-Tuning训练微调

机器配置 阿里云GPU规格ecs.gn6i-c4g1.xlargeNVIDIA T4显卡*1GPU显存16G*1 准备训练数据 进入/ChatGLM-6B/ptuningmkdir AdvertiseGencd AdvertiseGen上传 dev.json 和 train.json内容都是 {"content": "你是谁", "summary": "你好&…

AI:53-基于机器学习的字母识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

推荐PHP付费进群源码

PHP付费进群源码带自动定位基于ThinkPHP框架开发的&#xff0c;可以快速搭建知识付费粉丝进群。 更新&#xff1a; 1.首页付款轮播 2.城市定位功能 3.更新及优化域名库及支付设置 4.新增一张图模板设置模式&#xff0c;简化后台模板设置 5.前后台其他优化 演示地址&#xff1a…

使用navicat操纵数据库

<1>连接数据库 打开Navicat&#xff0c;点击“连接”&#xff0c;选择“MySQL”&#xff0c;这边是本机安装的mysql,主机为localhost&#xff0c;输入root密码。 使用Navicat创建数据库并导入SQL文件 SQL查询 普通SQL查询 USE demo; SELECT * FROM t_emp;SELECT emp…

【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种

Spring全家桶中CacheEvict无效情况共有以下几种 一、背景介绍二、原因分析三、解决方案 一、背景介绍 SpringBoot中使用Cacheable注解缓存数据&#xff0c;使用CacheEvict注解删除缓存。但是在项目使用过程中&#xff0c;发现使用CacheEvict注解删除缓存无效。 拓展&#xff…

腾讯云优惠券是什么?腾讯云优惠券怎么领取?

腾讯云是腾讯集团倾力打造的云计算品牌&#xff0c;为了吸引用户上云&#xff0c;经常推出各种优惠活动&#xff0c;其中就包括腾讯云优惠券。 1、腾讯云优惠券解释说明 腾讯云优惠券是腾讯云的一种优惠凭证&#xff0c;包括代金券和折扣券&#xff0c;领券之后新购、续费、升…

AD9371 官方例程裸机SW 和 HDL配置概述(三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

管理如何实现制度流程化 流程表单化 表单信息化 信息标准化?

业务化、流程化、信息化、数字化、自动化、智能化&#xff0c;是企业业务管理发展路径的六个必经阶段 制度业务化&#xff0c;业务表单化&#xff0c;表单流程化、流程信息化、信息标准化、标准制度华。 制度流程化、流程表单化、表单信息化、信息标准化、标准制度华。 管理…

Windows安装WinDbg调试工具

一.下载 微软官网下载SDK的地址&#xff0c;有win11&#xff0c;win10&#xff0c;win8&#xff0c;win7&#xff0c;其他 https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/ 二.安装 打开windbg\Installers\X64 Debuggers And Tools-x64_en-us.msi 要安…

【Redis】String字符串类型-常用命令

文章目录 String字符串类型常用命令setgetMGETMSET 计数命令INCRINCRBYDECRDECRBYINCRBYFLOAT 其它命令APPENDGETRANGESETRANGESTRLEN 命令总结 String字符串类型 1&#xff09;⾸先Redis中所有的键的类型都是字符串类型 2&#xff09;字符串类型的值&#xff08;value&#…

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载&#xff1a; a、使用curl下载&#xff1a;https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址&#xff1b;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件&#xff0c;下载地址&#xff1a;https…

云计算、大数据、人工智能、物联网、虚拟现实技术、区块链技术(新一代信息技术)学习这一篇够了!

目录 云计算 一、云计算的基本概念 二、云计算的分类 (一) IaaS (二) SaaS (三) PaaS 三、云环境的分类、云计算的四种部署模式 (一)公有云 (二)私有云 (三)社区云 (四)混合云 四、云计算的特点 (一)虚拟化技术 (二)动态可扩展 (三)按需部署 (四)灵活性高 (五…

左偏树学习笔记

定义 堆&#xff0c;是一棵树&#xff0c;且每个节点的键值都大于等于 / 小于其父亲的键值。 左偏树是一种可合并的堆&#xff0c;可以以 O ( log ⁡ n ) O(\log n) O(logn) 的复杂度实现合并。 性质 左偏树满足堆的性质。 我们设定一个值 dist \text{dist} dist&#xf…