forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution2.cpp
64 lines (61 loc) · 1.66 KB
/
Solution2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Solution {
private:
inline vector<int> Fun(vector<int> &keys, int counts[])
{
vector<int> item ;
for (int i = 0; i < keys.size(); ++i)
{
for (int j = 0; j < counts[i]; ++j)
item.push_back(keys[i]) ;
}
return item ;
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
if (nums.size() == 0)
return {} ;
vector<vector<int>> res ;
sort(nums.begin(), nums.end()) ;
const int len = nums.size() ;
nums.push_back(nums[0] - 1) ; //哨兵
vector<int> cnts ;
vector<int> keys ;
for (int i = 0, cnt = 1; i < len; ++i)
{
if (nums[i] != nums[i+1])
{
keys.push_back(nums[i]) ;
cnts.push_back(cnt) ;
// cout << "[" << nums[i] << "]: " << cnt << endl ;
cnt = 1 ;
}
else
++cnt ;
}
int counts[cnts.size()] = {0, } ;
int i ;
while (true)
{
res.push_back(Fun(keys, counts));
++counts[0] ;
for (i = 0; i < cnts.size(); ++i)
{
if (counts[i] > cnts[i])
{
if (i+1 == cnts.size())
{
++i ;
break ;
}
++counts[i+1] ;
counts[i] = 0 ;
}
else
break ;
}
if (i >= cnts.size())
break ;
}
return res ;
}
};