LeetCode-Subsets II-可重复子集和-DFS

https://oj.leetcode.com/problems/subsets-ii/

预处理一下记录每个数字以及其出现的次数。然后在DFS时枚举出现次数即可。

class Solution {
public:
    int n,m;
    vector <int> s;
    vector <int> d;
    vector<vector<int> > tot;
    vector <int> cur;
    void Solve(int p){
        if (p==n){
            tot.push_back(cur);
            return;
        }
        for (int i=0;i<=d[p];i++){
            Solve(p+1);
            cur.push_back(s[p]);
        }
        for (int i=0;i<=d[p];i++){
            cur.pop_back();
        }
    }
    vector<vector<int> > subsetsWithDup(vector<int> &S) {
        map <int,int> cm;
        m=S.size();
        for (int i=0;i<m;i++){
            if (cm.find(S[i])==cm.end()) cm[S[i]]=1;
            else cm[S[i]]++;
        }
        n=cm.size();
        s.resize(n);
        d.resize(n);
        map<int,int>::iterator it=cm.begin();
        int count=0;
        for (;it!=cm.end();it++) {
            s[count]=it->first;
            d[count++]=it->second;
        }
        Solve(0);
        return tot;
    }
};
View Code

 

posted @ 2014-10-12 23:22  zombies  阅读(191)  评论(0编辑  收藏  举报