DFS-Recall6

题目描述[原题链接][https://leetcode-cn.com/problems/subsets-ii/]

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

算法描述

​ 在之间子集那题的基础上排序然后判重即可;

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> res(1);
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
int cnt = res.size();
for(int j=0;j<cnt;j++){
vector<int> tmp = res[j];
if(i>0&&res[j].size()==0&&nums[i]==nums[i-1])continue;
tmp.push_back(nums[i]);
if(find(res.begin(),res.end(),tmp)==res.end()){
res.push_back(tmp);
}

}
}
return res;
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
getAns(nums, 0, new ArrayList<>(), ans);
return ans;
}

private void getAns(int[] nums, int start,
ArrayList<Integer> temp, List<List<Integer>> ans) {
ans.add(new ArrayList<>(temp));
for (int i = start; i < nums.length; i++) {
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
temp.add(nums[i]);
getAns(nums, i + 1, temp, ans);
temp.remove(temp.size() - 1);
}
}
}