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);
}
}
}