给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路:
在上一题的基础上 有重复的数字 先排序 然后对重复的元素 顺移到下一个位置
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
if (nums.length == 0 || nums == null) {
return res;
}
Arrays.sort(nums); // 排序
dfs(nums, 0, list, res); // 递归调用
res.add(new ArrayList<>());// 最后加进来空集
return res;
}
// [1, 2, 3]
private static void dfs(int[] nums, int start, List<Integer> list, List<List<Integer>> res) {
for (int i = start; i < nums.length; i++) {
list.add(nums[i]);
// item是以整数为元素的动态数组,而res是以数组为元素的数组,
// 在这一步,当item增加完元素后,item所有元素构成一个完整的子串,再由res纳入
res.add(new ArrayList<>(list));
dfs(nums, i + 1, list, res);
for (int j = i + 1; j < nums.length; j++)
if (nums[i] == nums[j])
i++;
else
break;
list.remove(list.size() - 1);
}
}