解题思路:
要生成子集,对于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