给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
1 #include"_000库函数.h" 2 3 4 class Solution { 5 public: 6 vector<vector<int>> subsetsWithDup(vector<int> &nums) { 7 if (nums.empty()) return {}; 8 vector<vector<int>> res(1); 9 sort(nums.begin(), nums.end()); 10 int size = 1, last = nums[0]; 11 for (int i = 0; i < nums.size(); ++i) { 12 if (last != nums[i]) {//去除重复数字 13 last = nums[i]; 14 size = res.size(); 15 } 16 int newSize = res.size(); 17 for (int j = newSize - size; j < newSize; ++j) { 18 res.push_back(res[j]); 19 res.back().push_back(nums[i]); 20 } 21 } 22 return res; 23 } 24 }; 25 26 //使用二叉树递归 27 class Solution { 28 public: 29 vector<vector<int>> subsetsWithDup(vector<int> &S) { 30 if (S.empty()) return {}; 31 vector<vector<int>> res; 32 vector<int> out; 33 sort(S.begin(), S.end()); 34 getSubsets(S, 0, out, res); 35 return res; 36 } 37 void getSubsets(vector<int> &S, int pos, vector<int> &out, vector<vector<int>> &res) { 38 res.push_back(out); 39 for (int i = pos; i < S.size(); ++i) { 40 out.push_back(S[i]); 41 getSubsets(S, i + 1, out, res); 42 out.pop_back(); 43 while (i + 1 < S.size() && S[i] == S[i + 1]) ++i;//去除重复数据 44 } 45 } 46 }; 47 48 49 void T090() { 50 Solution s; 51 vector<int>v = { 1,2,2 }; 52 vector<vector<int>> res; 53 res = s.subsetsWithDup(v); 54 for (auto &a : res) { 55 for (auto b : a) 56 cout << b << " "; 57 cout << endl; 58 } 59 cout << endl; 60 }