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

干货分享:图解两种常见回溯解法(一)

如大家所熟悉的,回溯算法是非常常见的一类经典问题类型,它可以看成每次扩展一个情况(扩展解空间),直到达到边界条件或者找到条件的所有解。

在这篇文章中,我们主要讨论回溯问题常见的两种写法和它们适用的题目。

解法一:先添加再回溯

在递归调用之前将当前的子集添加到结果列表中,然后进行递归调用,再在递归调用之后将最后添加的元素从子集中移除,以回溯到上一层。

C++

class Solution { public: void backtrack(vector<vector<int>> &res, vector<int> tmp, vector<int> nums, int index) { res.emplace_back(tmp); //加入结果集 for (int i = index; i < nums.size(); i++) { //遍历每个元素 tmp.push_back(nums[i]); // 加入第i个元素 backtrack(res, tmp, nums, i + 1); //递归 tmp.pop_back(); //撤销选择 } } vector<vector<int>> subsets(vector<int> &nums) { vector<vector<int>> res; vector<int> tmp; backtrack(res, tmp, nums, 0); return res; } };

解法二:先回溯后添加

在递归调用之前不将当前的子集添加到结果列表中,而是直接进行递归调用。在递归调用完成后,再将当前元素添加到子集中,再进行回溯到上一层。

C++

class Solution { public: void backtrack(vector<vector<int>> &res, vector<int> tmp, vector<int> nums, int index) { if(index == nums.size()) {//加入结果集 res.emplace_back(tmp); return; } backtrack(res, tmp, nums, index+ 1); //不加元素并递归 tmp.push_back(nums[index]); //加入第index个元素 backtrack(res, tmp, nums, index+ 1); //递归 tmp.pop_back(); //撤销选择 } vector<vector<int>> subsets(vector<int> &nums) { vector<vector<int>> res; vector<int> tmp; backtrack(res, tmp, nums, 0); return res; } };

这两种解法实质上是相同的,只是在选择添加子集和进行回溯的时机上有所差异。第一种解法在每次遍历时都会将当前的子集加入到结果集中,而第二种解法则是在递归结束时才将当前的子集加入到结果集中。

结合下面的图,能够清晰地理解这两种解法的差异,其中,加深的集合表示真正加入最终结果的数组的集合。

两个解法的 index 的含义基本一致,但是作用不同。它们都表示后续待选择数组的左边界,而解法二会使用 index 作为判断加入结果集的边界条件。

http://www.cnnetsun.cn/news/2943243.html

相关文章:

  • 当你的 Jira 成为 AI 训练数据:深度解析 Atlassian 智能意图与隐私边界
  • 【计算机毕业设计案例】基于 SpringBoot 框架的钱币文化交流平台设计与实践 钱币收藏资讯分享与互动交流系统(程序+文档+讲解+定制)
  • Pandas reset_index() 原理与生产级避坑指南
  • 植物大战僵尸终极修改器:PvZ Tools完整使用指南
  • Claude Code 从 Demo 到产线 · 企业 Harness 工程化的 8 道关卡
  • 从软件学习到OJ实战:构建高效算法能力提升路径
  • 5分钟上线可计费AI模型服务:Replicate+Cog+Stripe实战指南
  • 程序员就业:2026 年还能靠什么拿到 offer:别只背概念,先跑通这个闭环
  • MPC866 PowerQUICC:嵌入式RISC核心的架构解析与微架构设计
  • 一套键鼠控制多台电脑:Input Leap跨平台KVM终极指南
  • 终极Navicat无限试用重置:macOS用户告别14天限制的完整指南
  • Splashtop远程桌面核心技术解析:低延迟图形传输与实战应用
  • 语音带宽扩展技术:从传统方法到深度学习
  • 数据科学转行实战路线图:从零到入职的精准路径
  • 梯度提升算法原理与实战:从伪残差到弱树迭代
  • MPC860 PowerQUICC通信处理器:架构解析与嵌入式开发实战
  • 如何深度优化显卡性能:5个高级配置方案实战解析
  • agentscope笔记 todo
  • 期末论文高效突围!百考通AI 适配本科课程论文的实战使用指南
  • Grok 4.3长文本处理能力深度解析:128K上下文下的务实工程实践
  • AIGC创业落地三阶能力:问题定义、工程降维与商业翻译
  • G-Helper:华硕笔记本性能优化与硬件控制的三大核心功能解析
  • 实战Python爬取Airbnb上海房源信息:从入门到精通完整指南
  • Protobuf核心原理与实战:从数据序列化到gRPC服务定义
  • 非技术人AI编程全流程:从原型到上线的工程化表达
  • 技术博客即工程资产:用可演进架构沉淀真实技术生命
  • 5步掌握原神AI自动化神器:BetterGI终极指南,智能解放你的游戏时间
  • 对比学习核心原理与工程实践:从SimCLR到MoCo的算法解析与代码实现
  • 企业如何利用AI工具低成本开发移动应用?
  • 本文介绍了GR-RL具身强化学习框架的核心技术模块,涵盖工业机械臂控制、训练优化和安全保障等2201-2334底层源码实现。关键技术包括:机械臂零飘自适应补偿、工况自适应摩擦降级、显存碎片整理、异常工