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

Day65 代码随想录打卡|回溯算法篇---组合总和II

题目(leecode T40):

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。 

方法:本题的要求是每个元素在组合中只能出现一次,并且候选的数字是有可能重复的,因此需要去重操作。分析回溯三部曲。

1:传入参数与返回值:与组合总和的套路相同,此题还需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过。这个集合去重的重任就是used来完成的。

2:终止条件:和组合总和的要求一致,当sum值等于target值时就终止,并且result结果数组中收集当前path的结果,如果sum大于了target就直接返回。

3:单层处理逻辑:本题有一个难点就是因为元素有重复所以最终的结果中我们要去重,有一种方法是算出所有的结果然后再利用set或map的结构去重,但这种方法容易超时,因此我们在计算结果的过程中就需要去重了。去重具体使用的时一个bool类型的used数组,他记录着候选数组中的每个元素的值是否使用过了。具体逻辑入代码所示、

class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {if (sum == target) {result.push_back(path);return;}for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {// used[i - 1] == true,说明同一树枝candidates[i - 1]使用过// used[i - 1] == false,说明同一树层candidates[i - 1]使用过// 要对同一树层使用过的元素进行跳过if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {continue;}sum += candidates[i];path.push_back(candidates[i]);used[i] = true;backtracking(candidates, target, sum, i + 1, used); // 和39.组合总和的区别1,这里是i+1,每个数字在每个组合中只能使用一次used[i] = false;sum -= candidates[i];path.pop_back();}}public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<bool> used(candidates.size(), false);path.clear();result.clear();// 首先把给candidates排序,让其相同的元素都挨在一起。sort(candidates.begin(), candidates.end());backtracking(candidates, target, 0, 0, used);return result;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 53-3 内网代理5 - frp搭建二级代理
  • Pytest中的钩子函数
  • 初识c++(引用,inline,nullprt)
  • 基于MCU平台的HMI开发的性能优化与实战(下)
  • SpringBoot 实现视频分段播放(通过进度条来加载视频)
  • [面试爱问] https 的s是什么意思,有什么作用?
  • VUE之旅—day3
  • ExcelVBA运用Excel的【条件格式】(三)
  • 【文档智能】LACE:帮你自动生成文档布局的方法浅尝
  • c++初阶学习----入门(上)
  • Cesium版本升级webgl问题,glsl代码关键字修改
  • 通过高德地图 JS API实现单击鼠标进行标注
  • 基于 sftp 的 NAS (局域网文件存储服务器)
  • Linux文件编程(打开/创建写入读取移动光标)
  • 语义言语流畅性的功能连接和有效连接
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • ECMAScript6(0):ES6简明参考手册
  • export和import的用法总结
  • idea + plantuml 画流程图
  • Java教程_软件开发基础
  • js对象的深浅拷贝
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • React as a UI Runtime(五、列表)
  • SwizzleMethod 黑魔法
  • Vue UI框架库开发介绍
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 分享几个不错的工具
  • 盘点那些不知名却常用的 Git 操作
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 译米田引理
  • 主流的CSS水平和垂直居中技术大全
  • 阿里云API、SDK和CLI应用实践方案
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 如何正确理解,内页权重高于首页?
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​flutter 代码混淆
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (55)MOS管专题--->(10)MOS管的封装
  • (C++17) std算法之执行策略 execution
  • (Qt) 默认QtWidget应用包含什么?
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (一)基于IDEA的JAVA基础10
  • ./configure,make,make install的作用(转)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net framework profiles /.net framework 配置
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET使用存储过程实现对数据库的增删改查
  • @Mapper作用
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ Linux ] Linux信号概述 信号的产生
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器