class Solution {
// 保存结果
List<List<Integer>> res = new ArrayList<>();
// 暂存结果
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
// 升序排序
Arrays.sort(nums);
// 保存是否元素使用
boolean[] used = new boolean[nums.length];
backTracking(nums,0,used);
return res;
}
public void backTracking(int[] nums,int startIndex,boolean[] used){
// 收集结果
res.add(new ArrayList<>(path));
// 终止条件,也可以不写
if(nums.length == startIndex){
return;
}
for(int i=startIndex; i<nums.length; i++){
// 去重 此处操作类似于 组合总和Ⅱ
if(i>0 && nums[i]==nums[i-1] && used[i-1]==false){
continue;
}
path.add(nums[i]);
used[i] = true;
// 回溯
backTracking(nums,i+1,used);
used[i] = false;
path.remove(path.size()-1);
}
}
}
运行结果: