题目
主要的核心思想还是dfs。先第一个位置把所有的元素都填充一遍。再在第二个位置,把当前第一个位置填充的元素的后面所有元素依次填充在第二个位置。
需要注意的是,这道题里有重复的元素,在同一个位置里填充的时候,需要跳过。
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
res.add(new ArrayList<>());
Arrays.sort(nums);
dfs(res,new ArrayList<>(),0,nums.length,nums);
return res;
}
public void dfs(List<List<Integer>> res,List<Integer> list,int pos,int n,int[] nums){
if(pos==n) return;
for(int i=pos;i<n;i++){
if(i>pos && nums[i]==nums[i-1]) continue;
list.add(nums[i]);
res.add(new ArrayList<>(list));
dfs(res,list,i+1,n,nums);
list.remove(list.size()-1);
}
}
}