题目
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路
本题和子集问题唯一的区别就是题目中给出的整数数组会有重复元素,而且结果要去重(同一树层不能取重复,同一树枝可以取重复)。
注意:去重需要先对集合排序
本题相当于在子集问题的基础上加个去重操作,因为子集问题是需要遍历所有的结果
java代码如下:
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
dfs(nums, 0);
return res;
}
public void dfs(int[] nums, int startIndex){
res.add(new ArrayList<>(path));//去重需要先进行排序操作,为了相同元素相邻在一起
if(startIndex >= nums.length){
return;
}//这个代码可以加也可以不加,因为子集需要遍历所有节点,所以可以不用加终止条件
for(int i = startIndex; i< nums.length; i++){
//跳过当前树层使用过的重复的元素
if(i > startIndex && nums[i-1] == nums[i]){
continue;
}
path.add(nums[i]);
dfs(nums, i + 1);
path.remove(path.size() - 1);
}
}
}