给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路:
回溯,套用子集1的做法,这个排序很重要,不然gg
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);//想套用子集1的做法,这个排序很重要,不然gg
dfs(nums, 0, list, ans);
return ans;
}
public void dfs(int[] nums, int m, List<Integer> list, List<List<Integer>> ans) {
ans.add(new ArrayList<>(list));
for(int i=m;i<nums.length;i++)
{
if(i>m && nums[i] == nums[i-1])
continue;
list.add(nums[i]);
dfs(nums,i+1,list,ans);
list.remove(list.size()-1);
}
}
}
一样的做法,不同的风格 100%
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
getSubsetWithDup(result,list,nums,0);
return result;
}
private void getSubsetWithDup(List<List<Integer>> result, List<Integer> list, int[] nums, int index) {
result.add(new ArrayList<Integer>(list));
for(int i=index;i<nums.length;i++)
{
if(i>index&&nums[i]==nums[i-1])continue;
list.add(nums[i]);
getSubsetWithDup(result, list, nums, i+1);
list.remove(list.size()-1);
}
}
}