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], [] ]
Analysis:
lastNum - last number used to insert into res
lastSets - # of newly inserted sets generated by lastNum
In fact, if lastNum is equal to num[0], which is the number that will be inserted this time, only the combinations of this duplicate number with all of the sets inserted in the last round will be inserted into res as new subsets at this time.
public class Solution {
public void subsetsWithDup(int[] num, ArrayList<ArrayList<Integer>> res, int lastNum, int lastSets) {
if(num.length == 0) {
res.add(new ArrayList<Integer>());
return;
}
int nextSets = 0; // # of sets inserted currently
int size = res.size();
for(int i=(num[0]==lastNum)?size-lastSets:0; i<size; i++) {
ArrayList<Integer> tem = new ArrayList<Integer>(res.get(i));
tem.add(num[0]);
res.add(tem);
nextSets++;
}
if(num[0] != lastNum) {
ArrayList<Integer> cell = new ArrayList<Integer>();
cell.add(num[0]);
res.add(cell);
nextSets++;
}
lastSets = nextSets;
lastNum = num[0];
int[] nextNum = Arrays.copyOfRange(num, 1, num.length);
subsetsWithDup(nextNum, res, lastNum, lastSets);
return;
}
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
Arrays.sort(num);
subsetsWithDup(num, res, Integer.MIN_VALUE, 0);
return res;
}
}