题目描述:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
题目链接:LeetCode-90-子集Ⅱ
解题思路:跟 组合总和Ⅱ相似,都需要去重操作。
注意要先对数组排序,方便去重。
代码实现:
java
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);//先排序,有利于去重
boolean[] use = new boolean[nums.length];// use[i]=true,表示该位置已经被用过了
backTracking(nums, 0, use);
return res;
}
public void backTracking(int[] nums, int startIndex, boolean[] use){
res.add(new ArrayList<>(path));//要找的是每个节点,而不仅是叶子节点
if (startIndex >= nums.length){
return;
}
for (int i = startIndex; i < nums.length; i++) {
if (i>0 && nums[i-1] == nums[i] && use[i-1]==false){// 树层去重,如[1,2,2],第一个2已经走过了,就不走第二个 2 了
continue;
}
path.add(nums[i]);
use[i] = true;
backTracking(nums, i+1, use);
path.remove(path.size()-1);
use[i] = false;
}
}
}