Combination Sum

来源:互联网 发布:淘宝创建时间 编辑:程序博客网 时间:2024/04/30 22:44

DFS: almost the same, except the change of depth

I:

class Solution {public:    void dfs(vector<int> &num, int target, int start, vector<int> &cur, vector<vector<int> > &res) {        if (start>num.size()-1) return;        for (int i=start; i<num.size(); i++) {            int next_target=target-num[i];            if (next_target==0) {                cur.push_back(num[i]);                res.push_back(cur);                cur.pop_back();                return;            }            if (next_target>0) {                cur.push_back(num[i]);                dfs(num, next_target,i, cur, res);                cur.pop_back();            }        }    }    vector<vector<int> > combinationSum(vector<int> &candidates, int target) {        // Note: The Solution object is instantiated only once and is reused by each test case.        vector<vector<int> > res;        if (candidates.size()==0) return res;        vector<int> cur;        sort(candidates.begin(), candidates.end());        dfs(candidates, target, 0, cur, res);        return res;    }};


II:

Terminal condition: depth==num. size ()

Depth in next round = i+1 (! = depth + 1)

class Solution {public:    void dfs(vector<int> &num, int target, int start, vector<int> &cur, vector<vector<int> > &res) {        if (start>num.size()-1) return;        int temp=-1;        for (int i=start; i<num.size(); i++) {            if (temp==num[i]) continue;            temp=num[i];            int next_target=target-temp;            if (next_target==0) {                cur.push_back(temp);                res.push_back(cur);                cur.pop_back();                return;            }            if (next_target>0) {                cur.push_back(temp);                dfs(num, next_target,i+1, cur, res);                cur.pop_back();            }        }    }    vector<vector<int> > combinationSum2(vector<int> &num, int target) {        // Note: The Solution object is instantiated only once and is reused by each test case.        vector<vector<int> > res;        if (num.size()==0) return res;        vector<int> cur;        sort(num.begin(), num.end());        dfs(num, target, 0, cur, res);        return res;    }};