题目描述
给你一个整数数组 nums ,其中可能 包含重复元素 ,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
输入: [ 4 , 4 , 4 , 1 , 4 ]
输出: [ [ ] , [ 1 ] , [1 , 4 ] , [ 1 , 4 , 4 ] , [ 1 , 4 , 4 , 4 ] , [1 , 4 , 4 , 4 , 4 ] , [ 4 ] , [ 4 , 4 ] , [ 4 , 4 , 4 ] , [ 4 , 4 , 4 , 4 ] ]
力扣:90.子集 II
此题与 力扣:集合的子集 大同小异,唯一的区别在于 nums 数组中 包含重复元素 ,而针对这一点可参考题解 力扣:组合总和 II
class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<Integer> path = new ArrayList<>();
Arrays.sort(nums);
backtracking(path , nums , 0);
return result;
}
public void backtracking(List<Integer> path , int[] nums , int start){
result.add(new ArrayList<>(path));
if(start == nums.length) return ;
for(int i = start ; i < nums.length ; i ++){
// 小剪枝:同一层相同数值的结点,从第 2 个开始,候选数更少,结果一定发生重复,因此跳过,用 continue
if(i > start && nums[i] == nums[i - 1]){
continue;
}
path.add(nums[i]);
backtracking(path , nums , i + 1);
path.remove(path.size() - 1);
}
}
}