2014年10月7日星期二

[Leetcode] 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],
  []
]

模板题,重点在于如何去除重复,一开始一直WA,跪在去除重复的方法上了。应该是从排好序的数组前面开始,一个一个的加数,然后后面跳过所有重复的部分,比如2,2,2,那么过程就是{2,2,2};{2,2};{2};{};这样。
    public List<List<Integer>> subsetsWithDup(int[] num) {
        List<Integer> list = new ArrayList<Integer>();
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        Arrays.sort(num);
        subsets(num, 0, list, result);
        return result;
    }
    
    public void subsets(int[] num, int beg, List<Integer> list, List<List<Integer>> result) {
        if(beg == num.length) {
            result.add(new ArrayList<Integer>(list));
        }
        else {
            list.add(num[beg]);
            subsets(num, beg+1, list, result); // repeat to add duplicate elements
            list.remove(list.size() - 1);
            while(beg < num.length - 1 && num[beg] == num[beg+1]) beg++; // skip the rest duplicate elements
            subsets(num, beg+1, list, result);
        }
    }

    public List<List<Integer>> subsetsWithDup(int[] num) {
        List<Integer> list = new ArrayList<Integer>();
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        Arrays.sort(num);
        result.add(list);
        int cnt = 1, pre = num[0];
        
        for(int i = 0; i < num.length; i++) {
            if(num[i] != pre) {
                cnt = result.size();
                pre = num[i];
            }
            int beg = result.size() - cnt;
            int n = result.size();
            for(int j = beg; j < n; j++) {
                list = new ArrayList<Integer>(result.get(j));
                list.add(num[i]);
                result.add(list);
            }
        }
        
        return result;
    }

没有评论:

发表评论