File tree 1 file changed +64
-0
lines changed
1 file changed +64
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ private:
3
+ inline vector<int > Fun (vector<int > &keys, int counts[])
4
+ {
5
+ vector<int > item ;
6
+ for (int i = 0 ; i < keys.size (); ++i)
7
+ {
8
+ for (int j = 0 ; j < counts[i]; ++j)
9
+ item.push_back (keys[i]) ;
10
+ }
11
+ return item ;
12
+ }
13
+ public:
14
+ vector<vector<int >> subsetsWithDup (vector<int >& nums) {
15
+ if (nums.size () == 0 )
16
+ return {} ;
17
+ vector<vector<int >> res ;
18
+
19
+ sort (nums.begin (), nums.end ()) ;
20
+ const int len = nums.size () ;
21
+ nums.push_back (nums[0 ] - 1 ) ; // 哨兵
22
+
23
+ vector<int > cnts ;
24
+ vector<int > keys ;
25
+ for (int i = 0 , cnt = 1 ; i < len; ++i)
26
+ {
27
+ if (nums[i] != nums[i+1 ])
28
+ {
29
+ keys.push_back (nums[i]) ;
30
+ cnts.push_back (cnt) ;
31
+ // cout << "[" << nums[i] << "]: " << cnt << endl ;
32
+ cnt = 1 ;
33
+ }
34
+ else
35
+ ++cnt ;
36
+ }
37
+
38
+ int counts[cnts.size ()] = {0 , } ;
39
+ int i ;
40
+ while (true )
41
+ {
42
+ res.push_back (Fun (keys, counts));
43
+ ++counts[0 ] ;
44
+ for (i = 0 ; i < cnts.size (); ++i)
45
+ {
46
+ if (counts[i] > cnts[i])
47
+ {
48
+ if (i+1 == cnts.size ())
49
+ {
50
+ ++i ;
51
+ break ;
52
+ }
53
+ ++counts[i+1 ] ;
54
+ counts[i] = 0 ;
55
+ }
56
+ else
57
+ break ;
58
+ }
59
+ if (i >= cnts.size ())
60
+ break ;
61
+ }
62
+ return res ;
63
+ }
64
+ };
You can’t perform that action at this time.
0 commit comments