给定一个可能包含重复的整数的集合,S返回所有可能的子集。

来源:互联网 发布:国家电网网络大学登录 编辑:程序博客网 时间:2024/05/16 00:42

本题源自LeetCode

--------------------------------------------------------------------------------------

大神的回溯法思路:http://blog.csdn.net/versencoder/article/details/52071930

回溯法求解

1 传统的 内存超时:

    vector<vector<int> > subsetsWithDup(vector<int> &S) {        vector<vector<int>> result;        sort(S.begin(),S.end());        vector<int> list;        backTracing(S,0,result,list);        return result;    }    void backTracing(vector<int>& num,int start,vector<vector<int>>& result,vector<int>& list){        result.push_back(list);                for(int i=start;i<num.size();i++){                        if(i>start&&num[i]==num[i-1])                continue;            list.push_back(num[i]);            backTracing(num,start+1,result,list);            list.pop_back();        }    }

2  内存小。

  vector<vector<int>> res;    vector<int> tmp;    vector<vector<int> > subsetsWithDup(vector<int> &S) {        sort(S.begin(),S.end());        dp(0,0,S);        return res;    }    void dp(int start,int n,vector<int> &num){        if(tmp.size()==n){            res.push_back(tmp);            if(n<num.size()) dp(start,n+1,num);            else                return ;        }        for(int i=start;i<num.size();i++){            if(i>start&&num[i]==num[i-1])                continue;            tmp.push_back(num[i]);            dp(i+1,n,num);            tmp.pop_back();        }    }



阅读全文
0 0
原创粉丝点击