题目:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
代码:
class Solution {
public static List<List<Integer>> ans = new ArrayList<List<Integer>>();
//因为搜完之后并不知道子集合有多少个元素,所以用path有点不合适
//用一个boolean数组来判断某一数字选没选过
public static boolean[] v = new boolean[100];
public void roboot(int idx, int[] nums) {
if (idx >= nums.length) {
//record ans
List<Integer> temp = new ArrayList<Integer>();
for (int i = 0; i <= nums.length; i++) {
if (v[i])
temp.add(nums[i]);
}
ans.add(temp);
return;
}
//两种情况:idx取、不取
//前后两个数字相同的时候、不能只取后一个、不取前一个
if (idx > 0 && nums[idx - 1] == nums[idx] && v[idx - 1] == false) {
//这种情况下只能选择不取
v[idx] = false;
roboot(idx + 1, nums);
} else {
//否则、取或不取都可以
v[idx] = true;
roboot(idx + 1, nums);
v[idx] = false;
roboot(idx + 1, nums);
}
}
public List<List<Integer>> subsetsWithDup(int[] nums) {
ans.clear();
//先把数组排序
Arrays.sort(nums);
roboot(0, nums);
return ans;
}
}