news 2026/6/17 16:33:21

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
干货分享:图解两种常见回溯解法(二)

去重操作

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

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

解法一:

解法一通过在 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 会记录前一个元素是否被选中,当前一个元素选中,并且和当前的元素相同时,就不需要再次扩展这种情况了。如果没有这个变量的话,就没办法确定是否选择过这个元素,有可能会造成情况的遗漏。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 3:23:01

终极指南:使用SGP4库快速构建高精度卫星轨道预测系统

终极指南&#xff1a;使用SGP4库快速构建高精度卫星轨道预测系统 【免费下载链接】sgp4 Simplified perturbations models 项目地址: https://gitcode.com/gh_mirrors/sg/sgp4 SGP4&#xff08;Simplified General Perturbations 4&#xff09;算法是现代卫星轨道计算领…

作者头像 李华
网站建设 2026/6/16 3:16:49

零门槛做App:用MonkCode从想法到上线只需1天 [1781498241216]

用MonkCode写代码&#xff0c;提示词质量决定了代码质量。 一、明确需求 不好的提示词&#xff1a; “帮我做个网站” 好的提示词&#xff1a; “帮我做一个个人博客网站&#xff0c;使用Python Flask框架&#xff0c;包含文章发布、评论、搜索功能&#xff0c;使用SQLite数据…

作者头像 李华
网站建设 2026/6/16 3:16:49

Sebastian Raschka机器学习资源深度实践指南

1. 项目概述&#xff1a;为什么Sebastian Raschka的资源值得你花时间深挖在数据科学和机器学习的学习路径上&#xff0c;我见过太多人陷在“学了又忘、忘了再学”的循环里。不是资料不够多&#xff0c;而是真正能帮你把概念焊进脑子里、把代码写进肌肉记忆里的资源太稀缺。Seba…

作者头像 李华
网站建设 2026/6/16 3:15:51

EB Tresos新建工程详解:从AUTOSAR配置到S32K/TC3xx外设开发

1. 项目概述&#xff1a;EB Tresos 工程创建入门在汽车电子开发领域&#xff0c;尤其是基于英飞凌&#xff08;Infineon&#xff09;或恩智浦&#xff08;NXP&#xff09;等主流AURIX™、S32K系列MCU的项目中&#xff0c;EB Tresos Studio&#xff08;通常简称为EB&#xff09;…

作者头像 李华
网站建设 2026/6/16 3:14:52

出差一周,花没死,我没事:30元DIY一个植物自动浇水神器

&#x1f4a1; 阅读提示&#xff1a;本文教你用ESP8266土壤湿度传感器微型水泵&#xff0c;做一个自动浇水装置。出差一周回来&#xff0c;绿萝不仅没蔫&#xff0c;还发了新芽。总成本不到30元。&#x1f6a8; 开篇&#xff1a;你的植物&#xff0c;死于“太忙”作为一个养死过…

作者头像 李华
网站建设 2026/6/16 3:14:04

从零实现Linux系统调用:深入理解用户态与内核态的桥梁

1. 项目概述&#xff1a;从“头歌”到内核&#xff0c;一次系统调用的深度实践如果你正在学习操作系统&#xff0c;尤其是通过“头歌”这类在线实验平台&#xff0c;那么“系统调用”这个词对你来说一定不陌生。它常常是实验手册里的一个章节&#xff0c;老师PPT里的一页&#…

作者头像 李华