【回溯-7】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解题思路方法一回溯DFS思路对于每个数字有两种选择加或加-。递归到最后一个数字时判断和是否等于target是则计数 1代码实现class Solution { public: int findTargetSumWays(vectorint nums, int target) { int count 0; backtrack(nums, target, 0, 0, count); return count; } private: void backtrack(vectorint nums, int target, int index, int sum, int count) { if (index nums.size()) { if (sum target) count; return; } // 选择 backtrack(nums, target, index 1, sum nums[index], count); // 选择 - backtrack(nums, target, index 1, sum - nums[index], count); } };复杂度分析维度复杂度说明时间复杂度O(2^n)每个数字两种选择空间复杂度O(n)递归栈深度缺点数据量大时超时。方法二动态规划转化为 01 背包核心转化设所有数字的和为sum加的数字和为P加-的数字和为N。P N sum P - N target两式相加2P sum target即P (sum target) / 2问题转化为从nums中选一些数字使它们的和等于P求方案数。这就是 01 背包问题代码实现class Solution { public: int findTargetSumWays(vectorint nums, int target) { int sum 0; for (int num : nums) sum num; // 无法整除或目标绝对值超过总和 if ((sum target) % 2 ! 0 || abs(target) sum) return 0; int P (sum target) / 2; // dp[j] 和为 j 的方案数 vectorint dp(P 1, 0); dp[0] 1; for (int num : nums) { for (int j P; j num; j--) { dp[j] dp[j - num]; } } return dp[P]; } };具体过程示例nums [1,1,1,1,1],target 3sum 5 P (5 3) / 2 4 问题转化为从 [1,1,1,1,1] 中选数字和为 4 的方案数 dp[0] 1 遍历每个 1: dp[1] dp[0] → dp[1] 1 dp[2] dp[1] → dp[2] 1 dp[3] dp[2] → dp[3] 1 dp[4] dp[3] → dp[4] 1 遍历第二个 1: dp[1] dp[0] → dp[1] 2 dp[2] dp[1] → dp[2] 3 dp[3] dp[2] → dp[3] 4 dp[4] dp[3] → dp[4] 5 ...最终 dp[4] 5 ✅复杂度分析维度复杂度说明时间复杂度O(n × P)n 个数字P 是目标和空间复杂度O(P)dp 数组方法三记忆化搜索思路在回溯的基础上用哈希表记录(index, sum)的结果避免重复计算。代码实现class Solution { public: int findTargetSumWays(vectorint nums, int target) { unordered_mapstring, int memo; return dfs(nums, target, 0, 0, memo); } private: int dfs(vectorint nums, int target, int index, int sum, unordered_mapstring, int memo) { if (index nums.size()) { return sum target ? 1 : 0; } string key to_string(index) , to_string(sum); if (memo.count(key)) return memo[key]; int count dfs(nums, target, index 1, sum nums[index], memo) dfs(nums, target, index 1, sum - nums[index], memo); memo[key] count; return count; } };复杂度分析维度复杂度说明时间复杂度O(n × sum)每个 (index, sum) 只算一次空间复杂度O(n × sum)哈希表三种方法对比方法时间复杂度空间复杂度推荐度回溯O(2^n)O(n)⭐⭐动态规划01背包O(n × P)O(P)⭐⭐⭐⭐⭐记忆化搜索O(n × sum)O(n × sum)⭐⭐⭐⭐总结要点说明核心思想转化为 01 背包选一些数字和为 P关键公式P (sum target) / 2时间复杂度O(n × P)空间复杂度O(P)

相关新闻

A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?

A股量化尾盘筛选对数据时效敏感:行情链路变慢时先排查哪里?

一句话结论:尾盘筛选“变慢”时,先判断数据是“旧了”还是“到得慢”,再按“请求次数 → 限流与重试 → 网络 → 本地计算 → 调度”的顺序逐段计时。多数情况下,瓶颈出在逐只请求、重试放大和本地处理上,而不在行情源…

2026/10/5 6:54:27 阅读更多 →
第039篇 synchronized 原理:对象头、锁升级与重量级锁

第039篇 synchronized 原理:对象头、锁升级与重量级锁

synchronized 这题的分水岭特别清楚:能答出"对象头 Mark Word + monitorenter"的人不少,能讲清"锁升级的四个阶段、偏向锁在 JDK 15 被废弃、以及为什么 wait 必须在锁内调用"的人很少。面试官问的就是后面这层。理解了升级路径与锁竞争的真实代价,这道…

2026/10/5 6:54:27 阅读更多 →
第040篇 volatile:可见性、有序性与禁止重排

第040篇 volatile:可见性、有序性与禁止重排

volatile 这题的特别之处在于,它能把"看过资料"和"写过代码"区分开。前者的回答停在名词——可见性、有序性;后者的回答里有执行路径、有数据流向、有失败模式。面试官要的正是后者,而这两种回答之间的差距,比这道题本身的难度大得多。 先把结论放在前…

2026/10/5 6:54:27 阅读更多 →

最新新闻

从按键扫描到非阻塞状态机:嵌入式GPIO输入开发的进阶心得

从按键扫描到非阻塞状态机:嵌入式GPIO输入开发的进阶心得

写在前面:day4,我还在跟一块开发板较劲。前三天我把C语言基础、指针、位运算和开发环境都过了一遍,手边这块板子的LED例程也跑通了。本来以为第四天能顺风顺水往下推,结果一头扎进“按键输入”这个小项目里,才意识到自…

2026/10/5 8:41:17 阅读更多 →
STM32F107VC驱动MR25H40CDF MRAM:工业数据存储实战

STM32F107VC驱动MR25H40CDF MRAM:工业数据存储实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 8:41:17 阅读更多 →
OpenAI Dots实测:构建可复现的云端AI工作流

OpenAI Dots实测:构建可复现的云端AI工作流

1. 先泼一盆冷水:标题里没有的“GPT-6 Astra”,现实中根本不存在你点进这篇博文,大概率是因为被标题里的“🚀超越Muse!OpenAI dots深度实测”“GPT-6 Astra驱动云端电脑”“语音实时交互、多个任务一起跑”这些词戳中了…

2026/10/5 8:41:17 阅读更多 →
云计算运维学习路线:90天从零到独立排障

云计算运维学习路线:90天从零到独立排障

简介:这份《云计算运维学习路线及具体细节》文档面向希望系统入门或提升云计算运维能力的同学,尤其适合备战技能竞赛、PaaS方向的学习者。内容从Linux目录结构与常用命令、Iptables、NTP、Nginx、MySQL等基础服务讲起,逐步延伸到Shell脚本自动…

2026/10/5 8:41:17 阅读更多 →
用TwinCAT 3.1搭建EtherCAT主站:从零配置到运动控制实操

用TwinCAT 3.1搭建EtherCAT主站:从零配置到运动控制实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 8:41:17 阅读更多 →
智能仓储项目里技术专家总背锅?破局靠清晰责任边界

智能仓储项目里技术专家总背锅?破局靠清晰责任边界

做了快十年的智能仓储项目,从自动化立体库到AGV调度,从WMS上线到WCS联调,我发现自己慢慢从“技术专家”变成了项目里的“背锅侠”。做仓储自动化这行的朋友应该都有这种感觉:设备一停、账货不符、项目延期,第一个被拉出…

2026/10/5 8:40:17 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →