39. Combination Sum I/II

基础backtracing题,先排序一下,每次传一个参数表示开始的下标。注意dfs的时候,是i,不是i+1,因为同样的元素可以使用很多次。

class Solution {
public:
    vector<vector<int>> res;
    
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<int> tmp;
        dfs(candidates, target, tmp, 0);
        return res;
    }
    
    void dfs(vector<int>& candidates, int target, vector<int> &tmp, int start){
        if (target<0) return;
        if (target==0) res.push_back(tmp);
        for (int i=start;i<candidates.size();++i){
            tmp.push_back(candidates[i]);
            dfs(candidates,target-candidates[i],tmp,i); // not i+1 because we can reuse the same element
            tmp.pop_back();
        }
    }
};

 

40. Combination Sum II

有重复元素的情况。和Permutation II处理方法类似,如果 i>start && candidates[i] == candidates [i-1] , 说明当前元素是这层dfs的重复元素,不需要再对candidates[i]进行递归了。

class Solution {
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        vector<vector<int>> res;
        vector<int> cur;
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,res,cur,0);
        return res;
    }
    
    void dfs(vector<int>& candidates, int target, vector<vector<int>> &res, vector<int> &cur, int start){
        if (target<0) return;
        if (target==0) res.push_back(cur);
        for (int i=start;i<candidates.size();++i){
            if (i>start && candidates[i]==candidates[i-1]) continue;
            cur.push_back(candidates[i]);
            dfs(candidates,target-candidates[i],res,cur,i+1);
            cur.pop_back();
        }
    }
};

 

posted @ 2018-09-07 03:47  約束の空  阅读(103)  评论(0)    收藏  举报