Subsets II
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
Subscribe to see which companies asked this question
解题技巧:
该题的解法类似于Subsets的解法,但是存在重复的解,需要进一步处理。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector< vector<int> > res;
void Find(vector<int>& nums, vector<int> res0, int n)
{
int num, flag = 0;
if(n == nums.size())
{
for(int i = 0; i < res.size(); i ++)
{
num = 0;
if(res[i].size() == res0.size())
{
for(int j = 0; j < res[i].size(); j ++)
{
if(res[i][j] == res0[j])
{
num ++;
}
}
if(num == res0.size())
{
flag = 1;
break;
}
}
}
if(flag == 0) res.push_back(res0);
return;
}
for(int i = 0; i <= 1; i ++)
{
if(i == 1) res0.push_back(nums[n]);
Find(nums, res0, n+1);
}
}
vector< vector<int> > subsetsWithDup(vector<int>& nums)
{
vector<int> res0;
sort(nums.begin(), nums.end());
Find(nums, res0, 0);
return res;
}
int main()
{
vector<int> nums;
int n;
while(cin >> n)
{
nums.push_back(n);
}
subsetsWithDup(nums);
for(int i = 0; i < res.size(); i ++)
{
for(int j = 0; j < res[i].size(); j ++)
{
cout<<res[i][j]<<' ';
}
cout<<endl;
}
}