Leetcode_combination-sum-ii

来源:互联网 发布:网络嗅探器绿色版 编辑:程序博客网 时间:2024/06/06 16:55

地址:http://oj.leetcode.com/problems/combination-sum-ii/

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

Note:

  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

For example, given candidate set 10,1,2,7,6,1,5 and target 8
A solution set is: 
[1, 7] 
[1, 2, 5] 
[2, 6] 
[1, 1, 6] 

思路:dfs+回溯,注意去重。

参考代码:

class Solution {public:    void dfs(vector<vector<int>>&ans, vector<int>&num, vector<int>&visited, vector<int>tmpvec, int start, int target)    {        if(target==0)        {            if(find(ans.begin(), ans.end(), tmpvec)==ans.end())                ans.push_back(tmpvec);            return;        }        if(start>=num.size())            return;        if(!visited[start] && target-num[start]>=0)        {            visited[start] = true;            tmpvec.push_back(num[start]);            dfs(ans, num, visited, tmpvec, start+1, target-num[start]);            tmpvec.pop_back();            visited[start] = false;            dfs(ans, num, visited, tmpvec, start+1, target);        }            }    vector<vector<int> > combinationSum2(vector<int> &num, int target) {        vector<vector<int>>ans;        if(num.empty())            return ans;        sort(num.begin(), num.end());        vector<int>visited(num.size(), 0), tmpvec;        dfs(ans, num, visited, tmpvec, 0, target);        return ans;    }};


这次写的去重要好一点

//SECOND TRIAL
class Solution {
private:
    vector<vector<int> >ans;
    vector<int>num;
    void dfs(vector<int>&vec, vector<bool>&visited, int left)
    {
        if(!left)
        {
            ans.push_back(vec);
            return;
        }
        for(int i = 0; i<num.size(); ++i)
        {
            if(num[i] > left)
                break;
            if(i && num[i]==num[i-1] && !visited[i-1])
                continue;
            if(!visited[i] && (vec.empty() || num[i]>=vec.back()))
            {
                visited[i] = true;
                vec.push_back(num[i]);
                dfs(vec, visited, left-num[i]);
                vec.pop_back();
                visited[i] = false;
            }
        }
    }
public:
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        if(num.empty())
            return ans;
        vector<int>vec;
        sort(num.begin(), num.end());
        this->num = num;
        vector<bool>visited(num.size(), false);
        dfs(vec, visited, target);
        return ans;
    }
};

0 0