题目:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
- 输入: [1,2,2]
- 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
题解:
本题需要去重,但和之前的去重不一样,之前78.子集、40.组合总和是先排好序的,本题不能排序,因此用set去记录每层的元素,HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
class Solution {
LinkedList<Integer> path = new LinkedList<>();
List<List<Integer>> res = new LinkedList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
backtracking(nums, 0);
return res;
}
public void backtracking(int[] nums, int startIndex) {
//使用哈希表来表示是否本轮迭代中已经使用过该数字
Set<Integer> set = new HashSet<>();
if (path.size() >= 2) {
res.add(new LinkedList<>(path));
// 注意这里不要加return,因为要取树上的所有节点,元素个数下层越来越多
}
for (int i = startIndex; i < nums.length; i++) {
//元素小于前一个或者本层集合数字包含了现在的元素跳过循环
if (!path.isEmpty() && nums[i] < path.get(path.size() - 1) || set.contains(nums[i])) {
continue;
}
set.add(nums[i]);
path.add(nums[i]);
backtracking(nums, i + 1);
path.remove(path.size() - 1);
}
}
}
参考:代码随想录