91. 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],
  []
]
---

public class Solution {
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
       
        Arrays.sort(num);
        return helper(num, num.length-1);
        
    }
    
    private ArrayList<ArrayList<Integer>> helper(int[] num, int index) {

        ArrayList<ArrayList<Integer>> rst;

        // base case
        if (index == -1) {
            rst = new ArrayList<ArrayList<Integer>>();
            rst.add(new ArrayList<Integer>());
            return rst;
        }

        // avoid dup
        int oldIndex = index;
        while (index >= 1 && num[index - 1] == num[index]) {
            index--;
        }
        rst = helper(num, index - 1);

        ArrayList<ArrayList<Integer>> more = new ArrayList<ArrayList<Integer>>();
        int val = num[index];
        for (ArrayList<Integer> list : rst) {
            ArrayList<Integer> l = new ArrayList<Integer>(list);
            l.add(val);
            more.add(l);
        }
        rst.addAll(more);
        
    // dup part
while(index++ != oldIndex){ ArrayList<ArrayList<Integer>> dupmore = new ArrayList<ArrayList<Integer>>(); for (ArrayList<Integer> list : more) { ArrayList<Integer> l = new ArrayList<Integer>(list); l.add(val); dupmore.add(l); } more = dupmore; rst.addAll(more); } return rst; } }
posted @ 2013-09-21 01:06  LEDYC  阅读(167)  评论(0)    收藏  举报