题目

给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。

思考以及代码

如果我们直接套用39题的思路,那么就会出现重复的组合。

重复组合的产生,是因为集合中有重复的元素。
去重,就是使用过的元素不能重复选取。
我们result的重复组合的产生肯定是和重复元素有关的,我们从解空间树的深度(递归调用)和宽度(for循环)来看:
1、元素的重复的影响可能出现在在解空间树的宽度和深度上。
2、宽度上的重复决定了我们result解的组合的重复,深度上的重复决定了result解的每个子结果res的元素重复。
3、结合题意:如果是在宽度上重复我们需要去除,如果是在深度上重复我们不需要去除。

在宽度上进行去重所以我们在for循环的过程中加入限制。

//如果遇到同一个集合的重复元素,跳过这个元素即可
if(i > startindex && candidates[i] == candidates[i-1]) continue;

注意这里我们已经对原数组进行排序了,所以重复的元素一定靠在一起

class Solution {public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(vector<int>& candidates,int startindex,int n){   if(sum > n) return;if(sum == n){result.push_back(res);return;}for(int i=startindex;i<candidates.size();i++){//由于输入的数组是有序的,所以直接进行剪枝。如果sum加上这个集合元素大于目标,此层就不需要往后看了,因为后面的元素加上sum肯定大于目标if(sum+candidates[i]>n) break;//如果遇到同一个集合的重复元素,跳过这个元素即可if(i > startindex && candidates[i] == candidates[i-1]) continue;//处理结点;res.push_back(candidates[i]);sum+=candidates[i];//递归,探索下一层backtracking(candidates,i+1,n);     //递归sum-=candidates[i];//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {clear_solution_param();//排序加速剪枝sort(candidates.begin(),candidates.end());backtracking(candidates,0,target);return result;}
};

leetcode 40. 组合总和 II 思考分析相关推荐

  1. LeetCode 40. 组合总和 II(排列组合 回溯)

    1. 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...

  2. leetcode 216. 组合总和 III 思考分析

    可能需要回顾的文章; leetcode 77. 组合 思考分析 1.题目 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: ...

  3. leetcode —— 40. 组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  4. LeetCode 40 组合总和 II

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使 ...

  5. LeetCode 40. 组合总和 II(回溯)

    题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能 ...

  6. leetcode 39. 组合总和 40. 组合总和 II

    leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...

  7. 77.组合 | 40.组合总和II | 39.组合总和 | 784.字母大小写全排列

    77.组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合. 你可以按 任何顺序 返回答案. 示例 1: 输入:n = 4, k = 2 输出: [   [2,4], ...

  8. Suzy找到实习了吗 Day27 | 回溯进行中:39. 组合总和,40. 组合总和 II,131.分割回文串

    39. 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 , ...

  9. leetcode系列--40.组合总和 II

    leetcode系列–第40题.组合总和 II 给你一个由候选元素组成的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合 ...

最新文章

  1. gdb常用调试命令汇总!
  2. 无人机、IoT 设备都有漏洞?专访以色列老牌安全企业Check Point | 拟合
  3. Ubuntu 11.04 Unity最常用的31个快捷键
  4. 【PAT乙级】1041 考试座位号 (15 分)
  5. 毕业论文开题写作黄金法则
  6. ONAP发布“阿姆斯特丹”版本,为网络服务自动化制定标准
  7. VLC详细的使用说明以及配置说明综合示范实例精通VLC开发
  8. 程序员从幼稚到成熟会经历哪些变化?你都知道吗?
  9. 利用扩展欧几里得算法编程求逆元
  10. c语言 字母赋值给变量,C++变量(变量定义和赋值)详解
  11. 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性
  12. docker部署aliyundrive-webdav实现阿里云盘WebDAV服务
  13. Java poi读取Excel表格中公式的计算值
  14. Android仿微信朋友圈4实现评论动态时输入框和软键盘自动定位到内容下面
  15. 贵州学计算机,在贵州省计算机学校学习计算机专业如何?
  16. 【附PPT下载】2021腾讯广告算法大赛 ACM MM Grand Challenge录用论文揭晓
  17. Mac Webpack Vue项目的搭建
  18. Jmeter接口测试参数化详解
  19. 安卓手机电池校正方法教程
  20. HTTP状态码---服务器错误

热门文章

  1. ext3 tree tbar 初始化定义
  2. html中左侧播放器插件,简洁实用的html5音乐播放器插件
  3. java 匿名对象有引用,封闭对象的引用通过匿名类java进行转义
  4. React 学习笔记 —— Ref Hook
  5. vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
  6. vue-resource
  7. Arctext.js - 基于 CSS3 jQuery 的文本弯曲效果
  8. 一招搞定css页面布局
  9. windows下github 出现Permission denied (publickey)
  10. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)