Subsets II
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路:在SubSet基础上,取消重复项。如果该数字与上一数字重复,则只在报告该数字的ArrayList中增加该数字。需要用几个cnt记录上一次增加的集合数;
- public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
- ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer> >();
- ArrayList<Integer> cur = new ArrayList<Integer>();
- ArrayList<Integer> tmp;
- res.add(cur);
- int nl = num.length;
- if(nl==0) return res;
- Arrays.sort(num);
- int cnt=0;
- for(int i=0;i<nl;i++) {
- int sz = res.size();
- if(i>0 && num[i]==num[i-1]) {
- for(int j=cnt-1;j>=0;j--) {
- //tmp.clear();
- tmp = new ArrayList<Integer>(res.get(sz-j-1));
- tmp.add(num[i]);
- res.add(tmp);
- }
- } else {
- cnt = sz;
- for(int j=cnt-1;j>=0;j--) {
- tmp = new ArrayList<Integer>(res.get(sz-j-1));
- tmp.add(num[i]);
- res.add(tmp);
- }
- }
- }
- return res;
- }
思路二:去重的dfs,常规的dfs,遍历下一个状态集合。
- vector<vector<int> > result;
- void subset(vector<int> &S,vector<int> &cur,int start) {
- result.push_back(cur);
- for(int i=start;i<S.size();i++) {
- if(i!=start&&S[i]==S[i-1]) continue;
- cur.push_back(S[i]);
- subset(S,cur,i+1);
- cur.pop_back();
- }
- }
- vector<vector<int> > subsetsWithDup(vector<int> &S) {
- int N=S.size();
- sort(S.begin(),S.end());
- vector<int> cur;
- subset(S,cur,0);
- return result;
- }
思路三:最传统,先保存,在去重
- vector<vector<int> > subsetsWithDup(vector<int> &S) {
- int N=S.size();
- sort(S.begin(),S.end());
- set<vector<int> > res;
- vector<vector<int> > result;
- for(int i=0;i<pow(2,N);i++) {
- vector<int> tmp;
- for(int j=0;j<N;j++) {
- if((i>>j)&1) {
- tmp.push_back(S[j]);
- }
- }
- res.insert(tmp);
- }
- copy(res.begin(),res.end(),back_inserter(result));
- return result;
- }