Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
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) { // Start typing your Java solution below // DO NOT write main() function ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); res.add(new ArrayList<Integer>()); Arrays.sort(num); int start = 0; for(int i = 0; i < num.length; i++){ int size = res.size(); for(int j = start; j < size; j++){ ArrayList<Integer> sub = new ArrayList<Integer>(res.get(j)); sub.add(num[i]); res.add(sub); } if(i < num.length - 1 && num[i + 1] == num[i]) start = size; else start = 0; } return res; } }
For [1, 2, 3], order:
[]
[1]
[2] [1, 2]
[3] [1, 3] [2, 3] [1, 2, 3]
For [1, 2, 2], order:
[]
[1]
[2] [1, 2]
(start = size) [2, 2] [1, 2, 2]
public class Solution { ArrayList<ArrayList<Integer>> ret; ArrayList<Integer> cur; public void DFS(int[] num, int n) { if (num.length == n) { ret.add(new ArrayList<Integer>(cur)); return; } int count = 1; while (n + 1 < num.length && num[n] == num[n + 1]) { count++; n++; } for (int i = 0; i <= count; i++) { for (int j = 0; j < i; j++) cur.add(num[n]); DFS(num, n + 1); for (int j = 0; j < i; j++) cur.remove(cur.size() - 1); } } public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) { // Start typing your Java solution below // DO NOT write main() function ret = new ArrayList<ArrayList<Integer>>(); cur = new ArrayList<Integer>(); Arrays.sort(num); DFS(num, 0); return ret; } }For [1, 2, 3], order: [[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]