题目:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路:从数组nums中取子集,子集长度从0到len(nums长度)。在取不同长度子集时都对应一个长度为k(0-len)的数组tmp,之后依次向tmp[0]到tmp[k-1]赋值,每次赋值完一遍就保存一次tmp,作为一个子集。直到所有长度的子集都被保存完成。为tmp赋值的过程中要做一个去重判断,在每个位置上赋值的数不能和前一次赋值的数相同,否则会出现重复子集。
//结果集
vector<vector<int>> res;
void helper(vector<int> nums,vector<int> &tmp,int len,int aim,int times,int index)
{
if(times==aim)
{
res.push_back(tmp);
return;
}
else
{
for(int i=index;i<len;i++)
{
//去重判断
if(i>index&&nums[i]==nums[i-1])
continue;
tmp[times] = nums[i];
helper(nums,tmp,len,aim,times+1,i+1);
}
return;
}
}
vector<vector<int>> subsetsWithDup(vector<int> &nums)
{
int len = nums.size();
if(len==0)
return res;
sort(nums.begin(),nums.end());
//添加空集进去
vector<int> tmp;
res.push_back(tmp);
//得到不同长度的子集
for(int i=1;i<=len;i++)
{
//便于直接给tmp赋值
tmp.push_back(0);
helper(nums,tmp,len,i,0,0);
}
return res;
}