力扣算法题—090子集2

给定一个可能包含重复元素的整数数组 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 }

 

posted @ 2019-04-26 14:50  自由之翼Az  阅读(197)  评论(0编辑  收藏  举报