Skip to content

Commit 4418fb8

Browse files
authored
Update high-performance solution(cpp 4ms)
1 parent 7bc0dc7 commit 4418fb8

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
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+
};

0 commit comments

Comments
 (0)