class Solution {
private List ls;
private int n;
private LinkedList path;
public List<List<Integer>> subsetsWithDup(int[] nums) {
ls = new LinkedList<LinkedList<Integer>>();
path = new LinkedList<Integer>();
n = nums.length;
Arrays.sort(nums);
dfs(nums, 0);
return ls;
}
private void dfs(int[] nums, int u) {
if (u == n) {
ls.add(path.clone());
return;
}
int k = 0;
while (u + k < n && nums[u + k] == nums[u])
k++;
for (int i = 0; i <= k; i++) { //看看几个连续的数
dfs(nums, u + k);
path.add(nums[u]); //也就是连续加了多少次nums[u] 前后导致重复出现 递归变成nums[u]连续出现几次 也就是对象是一连串的数字而非一连串的数字中的一个一个
//而且是按顺序个数递增 所以不用考虑 2(1) 2(2) 和2(2) 2(1)元素位置上的变化
} //只是求子集 所以每个数只考虑选不选 而不需考虑顺序
for (int i = 0; i <= k; i++) //恢复现场 吐出来
path.removeLast();
}
}