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记录上一次增加的集合数;

  1. public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
  2. ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer> >();
  3. ArrayList<Integer> cur = new ArrayList<Integer>();
  4. ArrayList<Integer> tmp;
  5. res.add(cur);
  6. int nl = num.length;
  7. if(nl==0) return res;
  8. Arrays.sort(num);
  9. int cnt=0;
  10. for(int i=0;i<nl;i++) {
  11. int sz = res.size();
  12. if(i>0 && num[i]==num[i-1]) {
  13. for(int j=cnt-1;j>=0;j--) {
  14. //tmp.clear();
  15. tmp = new ArrayList<Integer>(res.get(sz-j-1));
  16. tmp.add(num[i]);
  17. res.add(tmp);
  18. }
  19. } else {
  20. cnt = sz;
  21. for(int j=cnt-1;j>=0;j--) {
  22. tmp = new ArrayList<Integer>(res.get(sz-j-1));
  23. tmp.add(num[i]);
  24. res.add(tmp);
  25. }
  26. }
  27. }
  28. return res;
  29. }

思路二:去重的dfs,常规的dfs,遍历下一个状态集合。

  1. vector<vector<int> > result;
  2. void subset(vector<int> &S,vector<int> &cur,int start) {
  3. result.push_back(cur);
  4. for(int i=start;i<S.size();i++) {
  5. if(i!=start&&S[i]==S[i-1]) continue;
  6. cur.push_back(S[i]);
  7. subset(S,cur,i+1);
  8. cur.pop_back();
  9. }
  10. }
  11. vector<vector<int> > subsetsWithDup(vector<int> &S) {
  12. int N=S.size();
  13. sort(S.begin(),S.end());
  14. vector<int> cur;
  15. subset(S,cur,0);
  16. return result;
  17. }

思路三:最传统,先保存,在去重

  1. vector<vector<int> > subsetsWithDup(vector<int> &S) {
  2. int N=S.size();
  3. sort(S.begin(),S.end());
  4. set<vector<int> > res;
  5. vector<vector<int> > result;
  6. for(int i=0;i<pow(2,N);i++) {
  7. vector<int> tmp;
  8. for(int j=0;j<N;j++) {
  9. if((i>>j)&1) {
  10. tmp.push_back(S[j]);
  11. }
  12. }
  13. res.insert(tmp);
  14. }
  15. copy(res.begin(),res.end(),back_inserter(result));
  16. return result;
  17. }
posted @ 2014-07-20 23:56  purejade  阅读(88)  评论(0编辑  收藏  举报