1. 解析
题目大意,返回数组的子集,不能出现重复出现的子集。难点在于如何过滤掉重复的元素
2. 分析
用size表示上一个子集的个数,newsize表示当前子集的个数,因为当前res结果存储的子集是上一个子集的基础上添加的,例如 size = 1, res = [ [], [1] ] ;size = 2, res = [[], [1], [2], [1, 2] ];所以我们可以将size作为下一个子集开始的位置,当出现重复元素的时候,从newsize-size所以开始,如果没有重复元素,则从0开始
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
//迭代解法
vector<vector<int>> result(1);
int size = 1;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i){
if (i > 0 && nums[i] != nums[i-1]){
size = result.size();
}
int newSize = result.size();
for (int j = newSize-size; j < newSize; ++j){
result.push_back(result[j]);
result.back().push_back(nums[i]);
}
}
return result;
}
};
3. 递归解法
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
// 递归解法
vector<vector<int>> result;
vector<int> result_set;
if (nums.empty()){
return result;
}
else if (nums.size() == 1){
result.push_back(result_set);
result.push_back(nums);
return result;
}
sort(nums.begin(), nums.end());
DFS(result, result_set, nums, 0);
return res;
}
void DFS(vector<vector<int>>& result, vector<int> result_set, vector<int>& nums, int pos){
result.push_back(result_set);
for (int i = pos; i < nums.size(); ++i){
result_set.push_back(nums[i]);
DFS(result, result_set, nums, i+1);
while (i < nums.size() - 1 && !result_set.empty() &&
result_set.back() == nums[i+1]) i++;
result_set.pop_back();
}
}
};