给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
方法一:
class Solution {
List<Integer> t = new ArrayList<Integer>();
List<List<Integer>> ans = new ArrayList<List<Integer>>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
dfs(false, 0, nums);
return ans;
}
public void dfs(boolean choosePre, int cur, int[] nums) {
if (cur == nums.length) {
ans.add(new ArrayList<Integer>(t));
return;
}
dfs(false, cur + 1, nums);
if (!choosePre && cur > 0 && nums[cur - 1] == nums[cur]) {
return;
}
t.add(nums[cur]);
dfs(true, cur + 1, nums);
t.remove(t.size() - 1);
}
}
方法二:
static List<Integer> l;
static List<List<Integer>> res;
public static List<List<Integer>> subsetsWithDup1(int[] nums) {
l = new ArrayList<Integer>();
res = new ArrayList<List<Integer>>();
Arrays.sort(nums);
subsetsWithDup(nums, 0, false);
return res;
}
public static void subsetsWithDup(int[] nums, int i, boolean choosePre) {
if(i == nums.length){
res.add(new ArrayList(l));
return;
}
// 2 2 2 2
l.add(nums[i]);
subsetsWithDup(nums, i+1, true);
l.remove(l.size()-1);
if(choosePre && nums[i-1] == nums[i])return;
subsetsWithDup(nums, i+1, false);
}
参考:https://leetcode-cn.com/problems/subsets-ii/solution/90-zi-ji-iiche-di-li-jie-zi-ji-wen-ti-ru-djmf/