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 39. Combination Sum


LeetCode All in One题解汇总(持续更新中...)

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


posted @ 2018-04-25 20:27  AlvinZH  阅读(395)  评论(0编辑  收藏  举报