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], [] ]
分析: 因为有重复的元素,重新模拟组合的情况,首先对于任何结果都含有{}, 然后加入第一个元素1,结果变为{{},{1}}, ,再加入第二个元素2,对原有结果中的两个分别添加进入,{{},{1},{2},{1,2}},再加入2只能为{{},{1},{2},{1,2},{2,2},{1,2,2}} 即第一次加2 添加了两个新组合{2},{1,2} 第二次添加的新组合为{2,2},{1,2,2} 这么看重复的时候就不要重新读取原有结果中的所有元素,在前一个里面直接加好了
class Solution { public: int findlen(int value, int i, const vector<int> & nums ){ int len=1; for(int j=i+1; j<nums.size()&&(nums[j]==value); j++) len++; return len; } vector<vector<int>> subsetsWithDup(vector<int>& nums) { vector<vector<int>> res; vector<int> empty; res.push_back(empty); sort(nums.begin(),nums.end()); for(int i=0; i<nums.size(); ){ int value = nums[i]; int len =1; cout <<"i = "<< i <<endl; len = findlen(value,i,nums); cout << len<<endl; int m =res.size(); for(int t=0; t<m; t++){ vector<int> temp=res[t]; for(int j=0; j<len; j++){ temp.push_back(value); res.push_back(temp); } } i+=len; } return res; } };