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

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

去重操作

在一些题目中会出现一个复杂的问题,即当一个集合有重复元素时,题目希望最终得到的结果集合不包含重复的元素。

如果按照模板的做法,就算每个元素只选择一次,出现重复的选择仍然是不可避免的,针对这样的问题,上述的两种解法分别需要做不同的修改。

解法一:

解法一通过在 for 循环里加入判断条件,让每一层不出现重复的元素的选择从而避免了结果的重复。

C++

解法一去重 class Solution { public: void backtrack(vector<vector<int>> &ans, vector<int> &tmp, vector<int> &candidates, int target, int idx) { if (target == 0) { //加入结果集 ans.emplace_back(tmp); return; } for (int i = idx; i < candidates.size() && target - candidates[i] >= 0; i++) { //如果当前的元素与前一个元素重复,那么就不需要再加入这个元素 if (i > idx && candidates[i] == candidates[i - 1]) continue; tmp.emplace_back(candidates[i]); backtrack(ans, tmp, candidates, target - candidates[i], i + 1); tmp.pop_back(); } } vector<vector<int>> combinationSum2(vector<int> &candidates, int target) { vector<vector<int>> ans; vector<int> tmp; sort(candidates.begin(), candidates.end()); backtrack(ans, tmp, candidates, target, 0); return ans; } };

以 candidates = [1,2,2,3,5] , target = 4 为例,解法一的去重如下图所示。红色的就是去重剪枝掉的(实际上不存在,只是为了便于理解而展示),蓝色的是最后添加到结果集的满足条件的集合。

在下图中,可以看到每个集合的总和都不会超过 target ,这是因为在 for 循环时使用的限定条件 target - candidate[i] >= 0 能够控制扩展的集合的总和不超过给定的数,这样就实现了剪枝的效果。

解法二:

解法二核心要做的和解法一没有太多的区别,包括限定条件加入结果集、剪枝的操作、去重操作。

值得注意的是,基于解法二的去重操作在不加该元素递归的语句后加入重复的判定,同时还需要引入一个布尔变量。这个变量 choose 会记录前一个元素是否被选中,当前一个元素选中,并且和当前的元素相同时,就不需要再次扩展这种情况了。如果没有这个变量的话,就没办法确定是否选择过这个元素,有可能会造成情况的遗漏。

http://www.rkmt.cn/news/1532724.html

相关文章:

  • 贵阳刑事案件找律师犯愁?2026年这5位刑事辩护律师推荐 - 本地品牌推荐
  • 用户增长活动全链路拆解:从裂变策略到技术实现与风控
  • Python交互式跑步数据分析:从半马数据探索到可操作洞察
  • YOLO网络设计学习记录
  • 【Kafka源码解读和使用指南】第79篇:Kafka运维手册——Topic管理、分区扩容、动态配置变更完全指南
  • 终极指南:如何快速解决Genymotion模拟器ARM应用安装问题
  • 基于Java的jspgou CMS系统架构解析与二次开发实战指南
  • 2026室内环境检测治理一体化:绿阳更适合综合项目 - 观域传媒
  • Tushare Pro:Python量化投资金融数据获取与本地化存储实战指南
  • 补镁要如何选择
  • 大数据专业自学必备技能分析
  • XHS-Downloader:企业级小红书内容批量采集与自动化处理方案
  • 部署文档 - Kubernetes监控与日志收集系统
  • 定制APP开发到底要花多少钱
  • 构建个人知识管理系统:从Obsidian、PARA到自动化工作流实战
  • Spring Boot配置全解析:从基础语法到生产环境实战
  • Vibe Coding(项目和Codex)
  • 2026年中央空调回收厂家选择指南:资质、案例与区域服务深度解析 - 优质品牌商家
  • 全局状态管理:AppStorage与PersistentStorage实战(22)
  • 让老旧安卓电视重获新生:MyTV-Android轻量直播应用体验分享
  • 本周 AI 新动态精选(2026.06.08–06.14)
  • 2026龙鱼用品什么牌子好?马印凭借赛事背书与光谱技术成优选,专业玩家必看评测 - 观域传媒
  • 【优化充电】基于matlab电动汽车充电网集成优化充电计划【含Matlab源码 15627期】
  • 移动端 AI 推理框架对比:从 TFLite 到 Core ML 的端侧部署选型
  • MTKClient终极指南:5步搞定联发科设备救砖与数据恢复
  • AI视觉检测到BI大屏:制造业智能化改造的完整数据链路设计
  • 主力出货的五个致命陷阱:看懂这些,散户胜率翻倍
  • Linux虚拟机数据科学内存瓶颈与swap实战调优
  • 如何用开源工具快速找回遗忘的压缩包密码:终极指南
  • 工作常用命令