题目链接
思路:
此题与78题的思路一致,不同的是,此题所给的数组中存在着重复元素,且题目要求不可以有重复的子集,那么我们在寻找子集的时候将重复的过滤掉即可。
这里主要说一下过滤重复的操作
首先给数组进行排序,这样就会把所有重复元素聚集在一起
接下来,在每一个搜索的时候,如果数组中当前值和上一个值相同,那么此值需要跳过
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
if (nums == null || nums.length == 0) {
ans.add(new ArrayList<>());
return ans;
}
// 给数组进行排序
Arrays.sort(nums);
dfs(nums, 0, new ArrayDeque<>(), ans);
return ans;
}
/**
*
* @param nums 原始数组
* @param start 从数组中第几个位置开始向后寻找
* @param path 当前的子集
* @param ans 最终的结果
*/
private void dfs(int[] nums, int start, Deque<Integer> path,
List<List<Integer>> ans) {
// 每一次进入时,将当前的子集添加进结果中
ans.add(new ArrayList<>(path));
for (int i = start; i < nums.length; i++) {
// 过滤掉重复数字
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
// 将当前数字添加进当前子集中
path.addFirst(nums[i]);
// 寻找下一个位置
dfs(nums, i + 1, path, ans);
// 将当前数字从当前子集中除去
path.pollFirst();
}
}