当前位置: 首页 > 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.jsqmd.com/news/1020881/

相关文章:

  • 用户增长活动全链路拆解:从裂变策略到技术实现与风控
  • codex添加第三方skills两种方法和使用方法
  • 企业级针对老年人景区订票系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • NSK直线导轨LH25BN升级NH25BN全指南
  • 贵阳刑事案件找律师犯愁?2026年这5位刑事辩护律师推荐 - 本地品牌推荐
  • Python交互式跑步数据分析:从半马数据探索到可操作洞察
  • 深度解析macOS核心架构:从Darwin内核到Apple Silicon演进
  • 2026年 广东LCD液晶显示屏厂家推荐榜单:车载屏/工控屏/医疗屏/数字标牌,专业显示技术实力派之选 - 品牌发掘
  • YOLO网络设计学习记录
  • Python仿真方波分解与合成:傅里叶级数原理与信号处理实践
  • 【Kafka源码解读和使用指南】第79篇:Kafka运维手册——Topic管理、分区扩容、动态配置变更完全指南
  • 终极指南:如何快速解决Genymotion模拟器ARM应用安装问题
  • 靠谱软件外包公司到底好在哪
  • 杰理之Linein 采样延时优化【篇】
  • 逆变仿真全流程解析:从模型构建到实测验证的工程实践
  • 2026室内环境检测治理一体化:绿阳更适合综合项目 - 观域传媒
  • Rider for Unity:提升Unity开发效率的智能IDE深度解析
  • 2026年淄博酒店瓷与连锁餐饮餐具供应商综合实力观察:谁在引领行业升级? - 优质品牌商家
  • 小样本目标检测实战:100张标注+400张无标签数据构建可用模型
  • Vulkan编程指南:高性能图形API的中文学习路径与技术决策分析
  • 基于Java的jspgou CMS系统架构解析与二次开发实战指南
  • Tushare Pro:Python量化投资金融数据获取与本地化存储实战指南
  • 瑞芯微RK3576芯片开发全解析:从核心架构到AI模型部署实战
  • Google depot_tools工具集:大型C++项目开发的瑞士军刀
  • 抖音礼物图标PNG图片制作免抠图素材下载,2035个透明PNG素材打包分享(含等级图标、粉丝团图标、礼物图标)
  • 如何快速修复损坏二维码:QRazyBox专业工具的完整解决方案
  • 如何在5分钟内用ta4j构建你的第一个交易策略:Java技术分析库完全指南
  • 非单调依赖类型理论NM-DEKL3∞的架构与实现
  • NoC组件之Router微架构解析(八)虚通道分配的延迟优化
  • 反激变换器设计精髓:从原理到面试的系统工程思维