【力扣】目标和

一、题目描述

给你一个非负整数数组 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

二、解题思路(动态规划)

 算法思路:分析问题,将问题转化为背包类型的问题

设我们最终选取的结果中,前面要加 + 号的数字之和为 a ,前面要加 - 号的数字之和为 b ,整个数组 的总和为 sum ,于是我们有: a + b = sum ,a - b = target .

上面两个式子消去 b 之后,可以得到 a = (sum + target) / 2。
也就是说,我们仅需在 nums 数组中选择一些数,将它们凑成和为 (sum + target) / 2 即可。  

1、状态表示

dp[i][j] 表示:在前 i 个数中选,总和正好等于 j ,一共有多少种选法。

2、状态转移方程

根据最后一个位置的元素,结合题目的要求, 有选择最后一个元素或者不选择最后一个元素两种策略:
(1)不选 nums[i] 那么凑成总和 j 的总方案,就要看在前 i - 1 个元素中选,凑 成总和为 j 的方案数。根据状态表示,此时 dp[i][j] = dp[i - 1][j] ;
(2)选择 nums[i] 这种情况下是 有前提条件的,即 nums[i] <= j 。
那么我们能够凑成总和为 j 的方案数,就要看在前 i - 1 个元素中选,能否凑成总和为 j - nums[i] 。 根据状态表示,此时 dp[i][j] = dp[i - 1][j - nums[i]].
综上所述, 两种情况如果存在的话,应该要累加在一起 因此,状态转移方程为:
dp[i][j] = dp[i - 1][j]
if(nums[i - 1] <= j) dp[i][j] = dp[i][j] + dp[i - 1][j - nums[i - 1]]

3、初始化

由于需要用到上一行的数据,因此我们可以先把第一行初始化。
第一行表示不选择任何元素,要凑成目标和 j 。只有当目标和为 0 的时候才能做到,因此第一行仅需初始化第一个元素 dp[0][0] = 1。

4、填表顺序

从上往下填写每一行,每一行的顺序是无所谓的。

5、返回值

根据状态表示,返回 dp[n][aim] 的值。
其中 n 表示数组的大小, aim 表示要凑的目标和。

三、代码

public int findTargetSumWays(int[] nums, int target) {int n = nums.length;int sum = 0;for(int x : nums) {sum += x;}int aim = (sum + target) / 2;//要找的aim是大于0的,小于0直接返回if(aim < 0 || (sum + target) % 2 == 1) {return 0;}int[][] dp = new int[n+1][aim+1];//初始化dp[0][0] = 1;//填表for(int i = 1; i <= n; i++) {for(int j = 0; j <= aim; j++) {dp[i][j] = dp[i-1][j];if(j >= nums[i-1]) {dp[i][j] = dp[i][j]+dp[i-1][j-nums[i-1]];}}}//返回值return dp[n][aim];}

四、优化

空间优化
所有的「背包问题」,都可以进行空间上的优化。
对于 01背包类型的,我们的优化策略是:
  • 删掉第一维;
  • 修改第二层循环的遍历顺序即可

 代码:

public int findTargetSumWays(int[] nums, int target) {int n = nums.length;int sum = 0;for(int x : nums) {sum += x;}int aim = (sum + target) / 2;if(aim < 0 || (sum + target) % 2 == 1) {return 0;}int[] dp = new int[aim+1];//初始化dp[0] = 1;//填表,注意填表顺序for(int i = 1; i <= n; i++) {for(int j = aim; j >= nums[i-1]; j--) {dp[j] = dp[j]+dp[j-nums[i-1]];}}//返回值return dp[aim];}

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

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

相关文章

鸿蒙开发HarmonyOS Next 网络框架retrofit 封装 viemodel使用

新手刚开始学习harmonyos开发&#xff0c;之前搞安卓开发习惯使用retrofit,结果在三方库中还真搜到了&#xff0c;然后就模拟学习一下。有不对的地方请指点一下。新手新手 oh-package.json5 引入库 retofit 需要使用2.0.1-rc.0 以上版本&#xff0c;修复了retrofit发送网络请…

变压器绕组内部故障的Simulink仿真

​利用变压器纵联差动保护的Simulink仿真模型是无法进行变压器绕组内部故障仿真的。为了解决这一问题&#xff0c;可将图中的三相变压器模型改变为三个单相变压器 , 在变压器属性框中选中 “三绕组变压器” (Three windings Transformer), 从而构造出一个一次绕组, 两个二次绕组…

《Windows API每日一练》4.2 设备环境

在第三章我们已经使用设备环境句柄在窗口客户区绘图了。在图形输出设备&#xff08;比如屏幕或者打印机&#xff09;上绘制图形&#xff0c;必须首先获取设备环境&#xff0c;即DC的句柄。当 Windows把这个句柄交给你的程序&#xff0c;Windows同时也就给予你使用这个设备的权限…

MySQL学习——管理复制源服务器的SQL语句

管理复制源服务器的语句&#xff0c;主要是指数据库环境中主从复制&#xff08;master-slave replication&#xff09;或主主复制&#xff08;master-master replication&#xff09;的设置。这些设置用于在多个数据库服务器之间同步数据&#xff0c;以实现高可用性、备份或负载…

【TensorFlow深度学习】TensorFlow实现超参数搜索与网格搜索法

TensorFlow实现超参数搜索与网格搜索法 TensorFlow实现超参数搜索与网格搜索法&#xff1a;优化模型性能的艺术引言环境准备与库导入数据准备构建模型函数网格搜索法实现结果分析与讨论高效超参数优化策略简介结论 TensorFlow实现超参数搜索与网格搜索法&#xff1a;优化模型性…

LogicFlow 学习笔记——8. LogicFlow 基础 事件 Event

事件 Event 当我们使用鼠标或其他方式与画布交互时&#xff0c;会触发对应的事件。通过监听这些事件&#xff0c;可以获取其在触发时所产生的数据&#xff0c;根据这些数据来实现需要的功能。详细可监听事件见事件API。 监听事件 lf实例上提供on方法支持监听事件。 lf.on(&…

fs.1.10 ON rockeylinux8 dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 rockeylinux8 docker上编译安装fs.1.10的流程记录&#xff0c;本文使用dockerfile模式。 环境 docker engine&#xff1a;Version 24.0.6 rockylinux docker&#xff1a;8 freeswitch&#xff1a;v1.10.7 dockerfi…

有没有硅基生命?AGI在哪里?

摘要 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和生命科学的探索逐渐成为人们关注的焦点。其中&#xff0c;关于硅基生命的可能性与AGI&#xff08;Artificial General Intelligence&#xff0c;即人工通用智能&#xff09;的实现&#xff0c;更是引…

VisionOS的未来愿景:苹果VisionPro创业者的愿望清单

随着苹果公司在增强现实(AR)领域的不断探索,VisionPro作为其前沿产品,已经开始展现出改变我们与数字世界互动方式的潜力。作为一名VisionPro创业者,对未来VisionOS的更新充满了期待,并提出了一系列愿望清单,这些愿望不仅代表了个人的需求,也反映了用户社区对苹果AR生态的…

Qt 槽函数重载时通过函数指针绑定

文章目录 信号槽函数绑定 信号 public slots:void testShow();void testShow(int a);signals:void show(int a);槽函数 void A::testShow(){qDebug() <<"testShow(" QString::number(1) ")" << QThread::currentThreadId(); } void A::tes…

服务器如何远程桌面连接不上,服务器远程桌面连接不上解决办法

服务器远程桌面连接不上&#xff0c;是IT运维中常见的挑战之一。针对这一问题&#xff0c;专业的解决方法通常涉及以下几个方面的排查与操作&#xff1a; 首先&#xff0c;我们需要检查网络连接是否正常。远程桌面连接依赖于稳定的网络连接&#xff0c;因此&#xff0c;确认服务…

c++处理字符串

在C中&#xff0c;std::string类型提供了许多成员函数来处理字符串。以下是一些常用的std::string成员函数&#xff1a; 1.长度&#xff1a; 2.字串&#xff1a; size():返回字符串中的字符数&#xff08;不包括终止的空字符&#xff09;。length():与size()功能相同。empty…

MT1350 分数计算

题目 编写函数&#xff0c;实现分数加减运算并输出结果&#xff0c;注意结果要化为最简分数。不考虑不合理的输入等特殊情况&#xff0c;比如分母不能为0。 格式 输入格式 输入形式A/BC/D或者A/B-C/D&#xff0c;其中ABCD为整型。 输出格式 输出形式X/Y&#xff0c;或-X/…

【中台】数字中台整体建设技术方案(doc原件获取)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集&#xff0c;结构化、半结构化、非结构化的数据采集&#xff0c;数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…

[大师C语言(第二十九篇)]C语言函数探秘

引言 函数是C语言中的基本单位&#xff0c;用于封装可重用的代码块。在C语言中&#xff0c;函数背后的技术包括函数的定义、调用、参数传递、返回值以及函数的内部实现等。本文将深入探讨C语言函数背后的技术&#xff0c;帮助你更好地理解和应用函数。 第一部分&#xff1a;函…

Visual Studio Code连接VMware虚拟机

1.安装VS Code插件 在拓展中安装插件 Remote-SSH 2.在虚拟机中安装OpenSSH服务器 使用超级用权限(root)更新软件包列表&#xff0c;Debian系统和Ubuntu系统使用apt包管理工具&#xff1a; sudo apt update CentOS系统使用yum或dnf包管理工具&#xff1a; sudo yum update …

“短剧制作新革命!揭秘开发高效系统的秘诀“

1、技术创新的应用&#xff1a; 云原生架构&#xff1a;采用云原生架构&#xff0c;以确保系统的高可用性和可扩展性&#xff0c;同时有效降低维护成本。 边缘计算&#xff1a;通过边缘计算技术&#xff0c;将内容分发到离用户最近的服务器&#xff0c;以减少延迟并提升播放速…

小程序 UI 风格,清新脱俗

小程序 UI 风格&#xff0c;清新脱俗

【QT5】<总结> QT主要技术点

文章目录 前言 一、QT串口编程 二、QT网络编程 三、QT多线程 四、QT连接数据库 五、开发板上运行QT程序 前言 在学习QT的过程中&#xff0c;旨在更好地巩固所学到的知识&#xff0c;本篇总结QT在嵌入式开发中的主要技术点。 一、QT串口编程 思维导图&#xff1a; 知识点…

如何查看当前的gruop_id 的kafka 消费情况 这个可以查看到是否存在消费阻塞问题

如何查看当前的gruop_id 的kafka 消费情况 这个可以查看到是否存在消费阻塞问题 命令如下: /kafka/bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --group GWW --describe 其中 127.0.0.1 为zookeeper 服务器ip GWW 为对应要查看的group_id 如下…