90. 子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
public List<List<Integer>> subsetsWithDup(int[] nums) {
//保存计数的数组
int[] array = new int[21];
//循环num进行计数
for (int i = 0; i < nums.length; i++) {
array[nums[i] + 10]++;
}
//创建结果集
List<List<Integer>> res = new ArrayList<>();
//插入空结果
res.add(new ArrayList<>());
//循环计数数组
for (int i = 0; i < array.length; i++) {
//判断存在当前计数
if (array[i] > 0) {
//穷举当前重复的数
List<List<Integer>> lists = new ArrayList<>();
List<Integer> list0 = new ArrayList<>();
list0.add(i - 10);
lists.add(list0);
for (int j = 1; j < array[i]; j++) {
List<Integer> list = new ArrayList<>();
list.addAll(lists.get(lists.size() - 1));
list.add(i - 10);
lists.add(list);
}
//拼接至现有结果集内
int size = res.size();
for (int j = 0; j < size; j++) {
for (int k = 0; k < lists.size(); k++) {
List<Integer> list = new ArrayList<>();
list.addAll(res.get(j));
list.addAll(lists.get(k));
res.add(list);
}
}
}
}
return res;
}