给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按任意顺序排列。
- 首先,排列问题自然而然会想到回溯算法,回溯算法最重要的就是在脑中形成一棵回溯数,这道题要求返回所有可能的子集,但是
nums
种有可能有重复元素,所以我们需要去重操作,但是在这道题中我们要注意下面的问题:- “树层去重”还是“树枝去重”?
——来自代码随想录- 从图中可以看出,同一树层上重复取 2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!
- 叶子存储?还是 节点存储?
- 我们要获取的是子集,而不是排列,所以一定是每得到一个节点的排列就把它放入结果集中
- “树层去重”还是“树枝去重”?
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
res.add(new ArrayList<>());
process(nums, 0, new ArrayList<>());
return res;
}
public void process(int[] nums, int startIndex, List<Integer> list) {
for (int i = startIndex; i < nums.length; i++) {
// 去重
if (i > startIndex && nums[i] == nums[i - 1]) {
continue;
}
list.add(nums[i]);
// 每得到一个节点的排列就把它放入结果集
res.add(new ArrayList<>(list));
process(nums, i + 1, list);
list.remove(list.size() - 1);
}
}
}