子集问题,相当于另一种组合问题,前面的组合问题需要在临时集合中存满数据,才会把结果添加到结果集合里,而子集则在每次递归中都将temp加入到result中,因为集合中有重复元素,且要防止结果中出现重复元素,所以要有剪枝操作;
class Solution {
List<List<Integer>> result ;
List<Integer> temp;
public List<List<Integer>> subsetsWithDup(int[] nums) {
result=new ArrayList<>();
temp=new ArrayList<>();
Arrays.sort(nums);
dfs(nums,0);
return result;
}
void dfs(int[] nums,int start){
result.add(new ArrayList<>(temp));
for(int i=start;i<nums.length;i++){
if(i>start&&nums[i]==nums[i-1])continue;
temp.add(nums[i]);
dfs(nums,i+1);
temp.remove(temp.size()-1);
}
}
}