当前位置: 首页 > news >正文

深搜练习(目标和)(6)

一.题目

494. 目标和 - 力扣(LeetCode)

二.思路讲解

2.1 思路讲解

本题要求为数组nums中的每个整数前面添加+-,使得整个表达式的计算结果等于target,并返回不同的表达式数目。这本质上是一个多阶段决策问题:对于每个元素,我们都有两种选择(加或减),我们需要枚举所有可能的符号组合,并统计和为target的个数。

我们可以采用深度优先搜索(DFS)的回溯框架来解决。递归函数dfs(pos, sum)表示当前已经处理到下标pos,且已累积的和为sum。当pos == n时,检查sum == target,若相等则计数加一。否则,对于当前元素nums[pos],我们有两种递归分支:

  • 选择加号dfs(pos+1, sum + nums[pos])

  • 选择减号dfs(pos+1, sum - nums[pos])

三.代码演示

class Solution { public: int ret; int findTargetSumWays(vector<int>& nums, int target) { dfs(nums,target,0,0); return ret; } void dfs(vector<int>& nums,int target,int path,int pos) { if(pos == nums.size()) { if(path == target) { ret++; return; } return; } dfs(nums,target,path + nums[pos],pos+1); dfs(nums,target,path - nums[pos],pos+1); } };

四.代码讲解

一、全局变量设计

为了实现回溯统计,我们定义一个成员变量

  • ret:整型,用于累计满足条件的表达式数目,初始为 0。

这里没有使用path数组来存储具体表达式,因为我们只关心结果计数,不关心具体符号序列。状态通过递归参数传递,不需要手动回溯恢复。

二、主函数findTargetSumWays

主函数接收数组nums和目标值target,调用递归函数dfs(nums, target, 0, 0)开始深度优先搜索,最后返回ret。参数含义:

  • path:当前已累积的和,初始为 0。

  • pos:当前处理到数组的第pos个元素,初始为 0。

三、递归函数dfs

递归函数dfs(nums, target, path, pos)的含义是:已经处理了前pos个元素,当前累积和为path,接下来需要为第pos个元素选择符号。执行流程如下:

1. 递归终止条件

pos == nums.size()时,说明所有元素都已处理完毕,得到一个完整的表达式。此时检查累积和path是否等于target,若相等,则将ret加 1。然后返回(无论是否相等,都结束此分支)。

2. 递归分支(两种选择)

对于当前元素nums[pos],我们有两种符号选择:

  • 加号:调用dfs(nums, target, path + nums[pos], pos + 1),表示将当前元素加入和。

  • 减号:调用dfs(nums, target, path - nums[pos], pos + 1),表示将当前元素减去。

这两种选择分别探索了不同的符号组合,最终会覆盖所有2^n种可能。

四、回溯与恢复现场

由于path是通过值传递的方式传入递归函数,而不是使用全局变量,因此不需要手动恢复现场。每一层递归都有自己的path副本,互不干扰。这种设计简化了回溯的复杂度,但会带来额外的拷贝开销(在此题中开销很小)。

http://www.jsqmd.com/news/735608/

相关文章:

  • 快速掌握网络分析仪差分信号4端口信号S参数测试
  • 如何安全备份微信聊天记录?3步完成数据解析与恢复的终极指南
  • 账单追溯功能如何帮助厘清团队成员的模型使用明细
  • Go语言爬虫工具claw-tools:高并发数据抓取与自动化实战指南
  • MCP:破解大模型困境的更优解,重构AI与世界的交互范式
  • 使用 context 工具管理命令执行环境:提升开发与自动化效率
  • 终极二维码修复工具:QRazyBox让失效二维码快速重获新生
  • 深搜练习(组合总和)(7)
  • 2026年专业旧房改造装修公司实力排行盘点:三室两厅两卫装修实景,公寓装修小户型装修公司,优选推荐! - 优质品牌商家
  • Figma中文界面终极指南:3分钟解锁全中文设计体验
  • AI抠图哪个软件好用?2026年最全对比指南,终于找到一款真正好用的
  • AI+行业:不是魔法,但比魔法更有趣
  • GeoAgent:基于地理相似性奖励的视觉定位强化学习模型解析
  • 第三部分-纹理与贴图——16. 高级纹理技术
  • 【2026收藏版】基于LLM的Agent构建全攻略,小白也能上手的生产级落地指南
  • 复杂室外应急保障:镜像视界无感定位,数字孪生支撑无盲区救援与态势推演
  • 2026年3月工业大风扇品牌推荐,工业大吊扇/永磁大风扇/工业风扇/工业大风扇/工业吊扇,工业大风扇实力厂家推荐 - 品牌推荐师
  • PicoLM:轻量级本地大语言模型推理引擎部署与优化指南
  • DaVinci异构计算中的RPC优化与缓存管理实践
  • java内部类的最详细详解
  • CacheSQL(四):CacheSQLClient——用一张路由表实现水平扩展
  • Meta 终止与萨马合作:因员工曝光雷朋 Meta 拍摄私密画面?
  • Visual C++运行库终极修复指南:快速解决Windows系统依赖问题
  • Spring AI 2.0 开发Java Agent智能体 - Ollama简介以及安装和使用
  • Visual C++运行库一体化解决方案:彻底解决Windows系统依赖问题的技术指南
  • 第四部分-模型与动画——18. 模型加载
  • 从零实现大语言模型推理引擎:PicoLM的极简架构与CPU部署实战
  • 内容创作团队借助 Taotoken 调用不同模型生成多样化文案
  • 小而美:快捷方式美化的极简产品设计理念
  • Silk v3音频解码器:打破微信QQ语音格式壁垒的技术实现