
解题思路:
要生成子集,对于vector 中的每个数,对于每个子集有两种情况,加入或不加入。
因此代码:
class Solution {
public:
void subsetG(vector<int> nums, vector<vector<int>>& result, vector<int> temp, int c)
{
if(c>=nums.size())
{
result.push_back(temp);
return ;
}
int i=c;
subsetG(nums,result, temp,i+1);
temp.push_back(nums[i]);
subsetG(nums,result, temp,i+1);
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> result;
vector<int> temp;
subsetG(nums, result,temp,0);
return result;
}
};

但是这样会造成许多重复的子集,因为重复的情况我们只需要考虑一次.可以分为拿和不拿. 如果拿的话就按照正常往下一层搜索, 如果不拿当前值的话, 那么也要跳过接下来和当前值相等的元素.
class Solution {
public:
void subsetG(vector<int> nums, vector<vector<int>>& result, vector<int> temp, int c)
{
if(c>=nums.size())
{
result.push_back(temp);
return ;
}
int i=c;
while(c+1<nums.size()&&nums[i]==nums[c+1])
{
c++;
}
subsetG(nums,result, temp,c+1);
temp.push_back(nums[i]);
subsetG(nums,result, temp,i+1);
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>> result;
vector<int> temp;
subsetG(nums, result,temp,0);
return result;
}
};

原文:http://www.cnblogs.com/fanhaha/p/7376532.html