leetcode 40. 组合总和 II 思考分析
题目
给定一个数组 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 思考分析相关推荐
- LeetCode 40. 组合总和 II(排列组合 回溯)
1. 题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只 ...
- leetcode 216. 组合总和 III 思考分析
可能需要回顾的文章; leetcode 77. 组合 思考分析 1.题目 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: ...
- leetcode —— 40. 组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...
- LeetCode 40 组合总和 II
题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使 ...
- LeetCode 40. 组合总和 II(回溯)
题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能 ...
- leetcode 39. 组合总和 40. 组合总和 II
leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...
- 77.组合 | 40.组合总和II | 39.组合总和 | 784.字母大小写全排列
77.组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合. 你可以按 任何顺序 返回答案. 示例 1: 输入:n = 4, k = 2 输出: [ [2,4], ...
- Suzy找到实习了吗 Day27 | 回溯进行中:39. 组合总和,40. 组合总和 II,131.分割回文串
39. 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 , ...
- leetcode系列--40.组合总和 II
leetcode系列–第40题.组合总和 II 给你一个由候选元素组成的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合 ...
最新文章
- gdb常用调试命令汇总!
- 无人机、IoT 设备都有漏洞?专访以色列老牌安全企业Check Point | 拟合
- Ubuntu 11.04 Unity最常用的31个快捷键
- 【PAT乙级】1041 考试座位号 (15 分)
- 毕业论文开题写作黄金法则
- ONAP发布“阿姆斯特丹”版本,为网络服务自动化制定标准
- VLC详细的使用说明以及配置说明综合示范实例精通VLC开发
- 程序员从幼稚到成熟会经历哪些变化?你都知道吗?
- 利用扩展欧几里得算法编程求逆元
- c语言 字母赋值给变量,C++变量(变量定义和赋值)详解
- 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性
- docker部署aliyundrive-webdav实现阿里云盘WebDAV服务
- Java poi读取Excel表格中公式的计算值
- Android仿微信朋友圈4实现评论动态时输入框和软键盘自动定位到内容下面
- 贵州学计算机,在贵州省计算机学校学习计算机专业如何?
- 【附PPT下载】2021腾讯广告算法大赛 ACM MM Grand Challenge录用论文揭晓
- Mac Webpack Vue项目的搭建
- Jmeter接口测试参数化详解
- 安卓手机电池校正方法教程
- HTTP状态码---服务器错误
热门文章
- ext3 tree tbar 初始化定义
- html中左侧播放器插件,简洁实用的html5音乐播放器插件
- java 匿名对象有引用,封闭对象的引用通过匿名类java进行转义
- React 学习笔记 —— Ref Hook
- vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
- vue-resource
- Arctext.js - 基于 CSS3 jQuery 的文本弯曲效果
- 一招搞定css页面布局
- windows下github 出现Permission denied (publickey)
- BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)