LeetCode 40. Combination Sum IIhtml
给一组数和一个目标值,求和为目标值的组合。数组中的每一个数最多只能取一次。数组
本题与上一题LeetCode 39. Combination Sum十分类似,改变的条件是:数组中每一个元素最多只能取一次。code
在上一题中,咱们是经过能够同一个起点(start)反复取同一个数获得结果,本题中为了不重复,递归的时候起点+1,能够保证不取同一个数。htm
这样作了以后还不够,本题中隐藏了一个改变,那就是原数组中有重复的数字,全部获得的结果中依然有重复的。如何解决了?两个办法,第一从源头上解决问题,在循环中,递归以前先判断一下:if (i > start && num[i] == num[i - 1]) continue; 仔细想一下,这样并不会使最终结果有所缺失,由于每次循环表示:尝试取当前数,进行递归,两个相同的数不须要尝试两次。第二种方法是总结过res使用set类型,最后传结果时在强制转换成vector。blog
class Solution { public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { set< vector<int> > res; vector<int> answer; sort(candidates.begin(), candidates.end()); solve(candidates, target, res, answer, 0); vector < vector<int> > result(res.begin(), res.end());//强制转换 return result; } void solve(vector<int>& candidates, int target, set< vector<int> >& res, vector<int>& answer, int start) { if(target < 0) return; else if(target == 0) res.insert(answer); else { for(int i = start; i < candidates.size(); i++) { answer.push_back(candidates[i]); solve(candidates, target-candidates[i], res, answer, i+1); answer.pop_back(); } } } };
LeetCode 39. Combination Sum递归
LeetCode All in One题解汇总(持续更新中...)ip
本文版权归做者AlvinZH和博客园全部,欢迎转载和商用,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利.leetcode