wayetan
12/31/2013 - 8:05 AM

Subsets

Subsets

/**
 * 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);
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        res.add(new ArrayList<Integer>());
        int start = 0;
        for(int i = 0; i < num.length; i++){
            int cur_size = res.size();
            for(int j = start; j < cur_size; j++){
                ArrayList<Integer> subset = new ArrayList<Integer>(res.get(j));
                subset.add(num[i]);
                res.add(subset);
            }
            if(i < num.length - 1 && num[i+1] == num[i])
                start = cur_size;
            else
                start = 0;
        }
        return res;
    }
    
    public List<List<Integer>> subsetsWithDupRecursive(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        helper(nums, 0, new ArrayList<Integer>(), res);
        return res;
    }
    
    public void helper(int[] nums, int start, List<Integer> path, List<List<Integer>> res) {
        res.add(path);
        for(int i = start; i < nums.length; i++) {
            if(i > start && nums[i] == nums[i - 1]) continue;
            List<Integer> tmp = new ArrayList<Integer>(path);
            tmp.add(nums[i]);
            helper(nums, i + 1, tmp, res);
        }
    }
}
/**
 * Given a set of distinct integers, 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,3], a solution is:
 * [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]
 */

public class Solution {
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        Arrays.sort(S);
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        res.add(new ArrayList<Integer>());
        for(int i = 0; i < S.length; i++){
            int cur_size = res.size();
            for(int j = 0; j < cur_size; j++){
                ArrayList<Integer> subset = new ArrayList<Integer>(res.get(j));
                subset.add(S[i]);
                res.add(subset);
            }
        }
        return res;
    }
    
    public List<List<Integer>> subsetsRecursive(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        helper(nums, 0, new ArrayList<Integer>(), res);
        return res;
    }
    
    public void helper(int[] nums, int start, List<Integer> path, List<List<Integer>> res) {
        res.add(path);
        for(int i = start; i < nums.length; i++) {
            List<Integer> tmp = new ArrayList<Integer>(path);
            tmp.add(nums[i]);
            helper(nums, i + 1, tmp, res);
        }
    }
    
    public ArrayList<ArrayList<Integer>> subsets2(int[] nums) {
        // write your code here
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        if(nums == null || nums.length == 0) {
            return res;
        }
        Arrays.sort(nums);
        ArrayList<Integer> subset = new ArrayList<Integer>();
        helper(res, subset, nums, 0);
        return res;
    }
    
    private void helper2(ArrayList<ArrayList<Integer>> res, 
                        ArrayList<Integer> subset,
                        int[] nums,
                        int pos) {
        // add a new object instead of a new reference
        res.add(new ArrayList<Integer>(subset));
        for(int i = pos; i < nums.length; i++) {
            subset.add(nums[i]);
            helper(res, subset, nums, i + 1);
            // remove the one trying to add to the set
            subset.remove(subset.size() - 1);
        }
    }
}