LeetCode 40. Combination Sum II
问题链接
LeetCode 40. Combination Sum II
题目解析
给一组数和一个目标值,求和为目标值的组合。数组中的每个数最多只能取一次。
解题思路
本题与上一题LeetCode 39. Combination Sum十分相似,改变的条件是:数组中每个元素最多只能取一次。
在上一题中,我们是通过可以同一个起点(start)反复取同一个数得到结果,本题中为了避免重复,递归的时候起点+1,可以保证不取同一个数。
这样做了之后还不够,本题中隐藏了一个改变,那就是原数组中有重复的数字,所有得到的结果中依然有重复的。如何解决了?两个办法,第一从源头上解决问题,在循环中,递归之前先判断一下:if (i > start && num[i] == num[i - 1]) continue; 仔细想一下,这样并不会使最终结果有所缺失,因为每次循环表示:尝试取当前数,进行递归,两个相同的数不需要尝试两次。第二种方法是总结过res使用set类型,最后传结果时在强制转换成vector。
参考代码
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 All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.