LeetCode 40 Combination Sum II

来源:互联网 发布:淘宝客户数据分析 编辑:程序博客网 时间:2024/06/13 04:06

题意:

集合中的每个数字只能使用一次,求出所有数字和为target的方案。


思路:

如果把集合中的数字计数,问题会变得和 http://blog.csdn.net/houserabbit/article/details/72677176 几乎一致。

我的方法思路与计数思路几乎一致,只不过我没有合并数字,而是枚举每种数字个数的时候只取排在后面的数字,这样就保证了方案不重复。


代码:

class Solution {public:    vector<vector<int>> combinationSum2(vector<int> &candidates, int target) {        n = candidates.size();        count = new int[n];        vector<vector<int>> ans;        sort(candidates.begin(), candidates.end());        dfs(n - 1, target, ans, candidates);        return ans;    }private:    int n;    int *count;    void dfs(int idx, int target, vector<vector<int>> &ans, vector<int> &candidates) {        if (candidates[idx] <= target &&            (idx == n - 1 || candidates[idx] != candidates[idx + 1] || count[idx + 1] == 1)) {            count[idx] = 1;            int newtar = target - candidates[idx];            if (newtar == 0) {                vector<int> res;                for (int i = idx; i < n; ++i) {                    if (count[i] == 1) {                        res.push_back(candidates[i]);                    }                }                ans.push_back(res);            } else if (idx > 0) {                dfs(idx - 1, newtar, ans, candidates);            }        }        count[idx] = 0;        if (idx > 0) {            dfs(idx - 1, target, ans, candidates);        }    }};