LeetCode-Combination Sum II-组合求和-DFS

https://oj.leetcode.com/problems/combination-sum-ii/

一道DFS搜索的题目,需要注意去除重复。可以使用一个map记录每个数字重复的次数。然后每次递归时-1,在递归退回时在加回来。

class Solution {
public:
    int n,m;
    vector <int> a;
    map <int,int> cm;
    vector <int> cur;
    vector<vector<int>> tot;
    void Solve(int p,int t){
        if (t==0) {
            tot.push_back(cur); 
            return;
        }
        if (p==n) return;
        if (t>=a[p]){
            if (cm[a[p]]) {
                cur.push_back(a[p]);
                cm[a[p]]--;
                Solve(p,t-a[p]);
                cm[a[p]]++;
                cur.pop_back();
            }            
        }
        Solve(p+1,t);
    }
    vector<vector<int>> combinationSum2(vector<int> &num, int target) {
        n=num.size();
        for(int i=0;i<n;i++){
            if(cm.find(num[i])==cm.end()) cm[num[i]]=1;
            else cm[num[i]]++;
        }
        a.resize(cm.size());
        int cnt=0;
        for(auto it=cm.begin();it!=cm.end();it++){
            a[cnt++]=it->first;
        }
        n=a.size();
        Solve(0,target);
        return tot;
    }
};

 

posted @ 2014-10-18 21:06  zombies  阅读(166)  评论(0编辑  收藏  举报