494. 目标和

给你一个非负整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
示例 1:
输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
示例 2:
输入:nums = [1], target = 1
输出:1
提示:
1 <= nums.length <= 20
0 <= nums[i] <= 1000
0 <= sum(nums[i]) <= 1000
-1000 <= target <= 1000


题解

首先对题目进行分析
所有的数字都要选,我们能做的是决定数字前面的符号,也就是这个数字是 + 还是 -
那么不妨将最后的结果视为 p - a,p为正数之和,a为负数之和,我们能够通过选择数字决定 p 是多少
又因为 p - a = target,a = sum(所有数的绝对值之和)- p,所以 p = (target + sum)/2
题目就变成从数组 nums 中选择数字使其和为 (target + sum)/2 (不能重复选择) ,这样就是01背包问题

由于 p 是非负整数,所以如果target + sum是奇数或者负数,那么答案肯定是 0

定义 arr[ i ][ j ] 为选择前 i 个数使其和为 j 的方法数
那么对于任意 arr[ i ][ j ] ,只有选择 nums[ i-1 ] 和不选择两种可能
如果 nums[ i-1 ]>j,只能不选,arr[ i ][ j ]=arr[ i-1 ][ j ]
否则,arr[ i ][ j ]=arr[ i-1 ][ j ] + arr[ i-1 ][ j-nums[ i-1] ]
初始化 arr[0][0]=1,其余arr[0][j]为0
按顺序遍历数组即可


代码如下↓

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {// p p是我们选择的正数// s-p s是所有正数的和// 2p-s=target// p=(target+s)/2// 那么就是选择数使其和为 p 即可int n=nums.size();int s=0;for(int i=0;i<n;i++){s+=nums[i];}if((target+s)%2 || target+s<0){return 0;}int p=(target+s)/2;vector<vector<int>> arr(n+1,vector<int>(p+1,0));arr[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=p;j++){arr[i][j]=arr[i-1][j];if(nums[i-1]<=j){arr[i][j]+=arr[i-1][j-nums[i-1]];}}}return arr[n][p];}
};

优化空间

二维滚动数组

我们发现 arr[ i ][ j ]=arr[ i-1 ][ j ] + arr[ i-1 ][ j-nums[ i-1] ] 或 arr[ i ][ j ]=arr[ i-1 ][ j ]
arr[ i ][ j ] 仅与上一行的 arr 有关,那我们不妨将二维数组缩减至两行,一行存 i-1 ,一行存 i
在执行过程中进行滚动,将 i 和 i-1变为 i%2 和 (i-1)%2,从而优化空间


代码如下↓

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {// p p是我们选择的正数// s-p s是所有正数的和// 2p-s=target// p=(target+s)/2// 那么就是选择数使其和为 p 即可int n=nums.size();int s=0;for(int i=0;i<n;i++){s+=nums[i];}if((target+s)%2 || target+s<0){return 0;}int p=(target+s)/2;vector<vector<int>> arr(2,vector<int>(p+1,0));arr[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=p;j++){arr[i%2][j]=arr[(i-1)%2][j];if(nums[i-1]<=j){arr[i%2][j]+=arr[(i-1)%2][j-nums[i-1]];}}}return arr[n%2][p];}
};

一维数组

类似的,既然arr[ i ][ j ] 仅与上一行的 arr 有关,一行,我们能否用一位数组表示

arr[ j ] = arr[ j ] + arr[ j-nums[ i-1 ] ](前面的arr[ j ]是arr[ i ][ j ],后面的都是arr[ i-1 ][ j ],上一行的)

同时,我们发现 arr[ j+1 ] 与其上一行的前面的数据有关
如果我们从前往后进行遍历,那么后面的 arr[ j+1 ] 需要的 arr[ j ] 的数据就被新计算出来的 arr[ j+1 ] 给覆盖了
所以我们需要从后向前遍历,这样就不会发生需要的数据被覆盖的问题了


代码如下↓

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {// p p是我们选择的正数// s-p s是所有正数的和// 2p-s=target// p=(target+s)/2// 那么就是选择数使其和为 p 即可int n=nums.size();int s=0;for(int i=0;i<n;i++){s+=nums[i];}if((target+s)%2 || target+s<0){return 0;}int p=(target+s)/2;vector<int> arr(p+1);arr[0]=1;for(int i=1;i<=n;i++){for(int j=p;j>=0;j--){if(nums[i-1]<=j){arr[j]+=arr[j-nums[i-1]];}}}return arr[p];}
};

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

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

相关文章

Dify 1.8.0 全网首发,预告发布

距离Dify 1.7.2过去两周了 Dify 1.8.0 又跟大伙见面了&#xff01; 1.8.0&#xff0c;属于主版本号不变、但第二位数字更新的“阶段性大更”&#xff0c;意味着功能上的显著优化和体验上的重要升级。 根据官方的Github日志&#xff0c;这一版本将继续聚焦三大核心方向&#x…

基于LangChain框架搭建AI问答系统(附源码)

AI问答系统1. 背景知识2. 问答系统流程3. 知识问答系统相关组件3.1 文档加载器3.2 文档切割器3.3 嵌入模型包装器3.4 向量存储库3.5 模型包装器3.6 链组件4. 问答系统演示4.1 问答程序4.2 演示大模型回答效果5.问答系统代码1. 背景知识 在人工智能技术飞速发展的今天&#xff…

【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的报错

Qt designer&#xff1a;可直接在designer界面&#xff0c;使用拖拽的方式设计需要的界面&#xff0c;可设定部分属性。安装Pyside2后&#xff0c;designer默认在python安装目录的Lib/sit_packages/PySide2文件夹中。designer使用&#xff1a;① 双击打开designer.exe&#xff…

前端常见安全问题 + 防御方法 + 面试回答

目录 XSS&#xff08;跨站脚本攻击&#xff09;CSRF&#xff08;跨站请求伪造&#xff09;SQL 注入文件上传漏洞其他前端常见安全问题面试常见问答 1. XSS&#xff08;跨站脚本攻击&#xff09; 定义 XSS&#xff08;Cross-Site Scripting&#xff09;是一种 通过注入恶意脚…

jxWebUI--下拉选择框

下拉选择框提供了预先定义好的选项&#xff0c;用户只能在这些选项中选择输入。 combobox 定义格式 combobox 控件名 属性列表 ;属性 bind 类型&#xff1a;string 缺省值&#xff1a; 输入控件所绑定的变量名。当给输入控件bind了一个变量名后【bindbind_var_name】&#xff0…

大模型时代:用Redis构建百亿级向量数据库方

大模型时代&#xff1a;用Redis构建百亿级向量数据库方案第一章&#xff1a;大模型时代的向量数据库挑战1.1 大模型时代的特征与需求1.2 向量数据库的核心价值1.3 百亿级向量的技术挑战第二章&#xff1a;Redis作为向量数据库的优势2.1 Redis的核心优势2.2 Redis向量搜索模块&a…

jsqlparser(六):TablesNamesFinder 深度解析与 SQL 格式化实现

在数据库应用开发中&#xff0c;SQL语句的解析和处理是一项常见而重要的任务。本文将深入探讨 JSQLParser 中的 TablesNamesFinder 类&#xff0c;分析其核心原理、与 AST 访问接口&#xff08;CCJSqlParserVisitor &#xff09;的关系、使用场景&#xff0c;并通过实际代码示例…

Python训练营打卡Day49-神经网络调参指南

知识点回顾&#xff1a;随机种子内参的初始化神经网络调参指南 参数的分类调参的顺序各部分参数的调整心得 作业&#xff1a;对于day41的简单cnn&#xff0c;看看是否可以借助调参指南进一步提高精度。 随机种子 import torch import torch.nn as nn# 定义简单的线性模型&…

Elasticsearch 常用任务管理命令及实战应用

常用任务管理命令 列出所有任务 curl -X GET "http://<es_host>:<es_port>/_tasks?detailedtrue&pretty" -H Content-Type: application/json获取特定类型的任务 curl -X GET "http://<es_host>:<es_port>/_tasks?actions<act…

Java试题-选择题(26)

Java试题-选择题(26) 题目 下列有关Thread的描述,哪个是正确的 ? A:启动一个线程的方法是:thread. run() B:结束一个线程的通常做法是:thread. stop() C:将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自…

缓存的原理、引入及设计

开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 我们为什么要学习缓存呢&#xff1f;有必要学习缓存吗&#xff1f; 缓存的使用&#xff0c;是提升系统性能、改善用户体验的唯一解决之道。 其实&#xff0c;作为互联网公司&#xff0c;只要有直接面对用户的业…

单片机如何控制模数转换芯片

一、介绍单片机控制模数转换&#xff08;ADC&#xff09;芯片的核心是通过通信接口发送控制指令&#xff0c;并读取转换后的数字信号&#xff0c;本质是“指令交互数据传输”的协同过程&#xff0c;具体实现需分4步完成&#xff0c;关键在于接口匹配和时序同步。二、核心1. 先明…

【Proteus仿真】开关控制系列仿真——开关控制LED/拨码开关二进制计数/开关和继电器控制灯灭

目录 0案例视频效果展示 0.1例子1&#xff1a;开关控制LED灯亮灭 0.2例子2&#xff1a;数码管显示拨码开关二进制计数(000~255) 0.3例子3&#xff1a;开关和继电器控制灯亮灭 1基础知识补充 1.1 74LS245双总线收发器 1.1.1 引脚及功能 1.1.2应用场景 1.1.3真值表 1.2…

Q1 Top IF 18.7 | 基于泛基因组揭示植物NLR进化

文章DOI: 10.1016/j.chom.2025.07.011 标题&#xff1a;Pangenomic context reveals the extent of intraspecific plant NLR evolution 期刊&#xff1a;Cell Hose & Microbe (https://i-blog.csdnimg.cn/direct/0e31f86b94d348b0a1adb084ec4e49b7.png)(https://i-blog.cs…

技术干货|Prometheus PromQL查询语言之聚合操作内置函数

聚合操作 Prometheus还提供了下列内置的聚合操作符,这些操作符作用域瞬时向量。可以将瞬时表达式返回的样本数据进行聚合,形成一个新的时间序列。 sum (求和) min (最小值) max (最大值) avg (平均值) stddev (标准差) stdvar (标准差异) count (计数) count_values …

Redis 哨兵(Sentinel)全面解析

在2025年的数字化浪潮中&#xff0c;想象这样一个场景&#xff1a;凌晨3点&#xff0c;电商平台流量突然暴增&#xff0c;主Redis服务器因硬件故障突然宕机。几年前&#xff0c;这意味着紧急电话、慌乱的运维人员和不可避免的业务中断。而今天&#xff0c;用户甚至没有察觉任何…

【数学史冷知识】关于行列式的发展史

学习的途中会遇到一些有意思的东西&#xff0c;我想着做一个专栏《艾萨克纪行简报》&#xff0c;专门写这些知识发展历史。可以让您从繁忙的学习生活中放松&#xff0c;添些耀彩。行列式和微积分一样&#xff0c;都是两个人独立发现的。而且还都有莱布尼茨。1683 年&#xff0c…

【python】python进阶——生成器

目录 一、生成器介绍 1.1 生成器与迭代器的关系 1.2 生成器与return比较 二、创建生成器 方法1: 生成器函数 方法2: 生成器表达式 三、生成器的实际应用场景 3.1 处理大型文件 3.2 生成无限序列 3.3 数据管道处理 四、生成器的高级用法 4.1 使用send()方法传递值 …

【Pytorch】生成对抗网络实战

GAN框架基于两个模型的竞争&#xff0c;Generator生成器和Discriminator鉴别器。生成器生成假图像&#xff0c;鉴别器则尝试从假图像中识别真实的图像。作为这种竞争的结果&#xff0c;生成器将生成更好看的假图像&#xff0c;而鉴别器将更好地识别它们。 目录 创建数据集 定…

Java基础第7天总结(代码块、内部类、函数式编程)

代码块静态代码块&#xff1a;有static修饰&#xff0c;属于类&#xff0c;与类一起优先加载&#xff0c;自动执行一次实例代码块&#xff1a;无static修饰&#xff0c;属于对象&#xff0c;每次创建对象时&#xff0c;都会优先执行一次。package com.itheima.code;import java…