leetcodeSolution to some Leetcode problems written in C++ |
git clone git://git.dimitrijedobrota.com/leetcode.git |
Log | Files | Refs | README | LICENSE |
0077.cpp (1730B)
0 // Recursive solution
1 class Solution {
2 vector<int> crnt;
3 vector<vector<int>> res;
4 void rec(int s, int n, int k) {
5 if (s > n + 1) return;
6 if (!k) {
7 res.push_back(crnt);
8 return;
9 }
11 crnt.push_back(s);
12 rec(s + 1, n, k - 1);
13 crnt.pop_back();
14 rec(s + 1, n, k);
15 }
17 public:
18 vector<vector<int>> combine(int n, int k) {
19 rec(1, n, k);
20 return res;
21 }
22 };
24 // Iterative solution
25 class Solution {
26 public:
27 vector<vector<int>> combine(int n, int k) {
28 vector<vector<int>> res;
29 vector<int> iter;
30 iter.reserve(k);
31 for (int mask = (1 << k) - 1; mask < 1 << n; mask++) {
32 if (__builtin_popcount(mask) != k) continue;
34 for (int crnt = mask, idx; crnt; crnt ^= 1 << (idx - 1)) {
35 idx = __builtin_ffs(crnt);
36 iter.push_back(idx);
37 }
38 res.push_back(iter);
39 iter.clear();
40 }
41 return res;
42 }
43 };
45 // Improved iterative solution with bit twiddling
46 class Solution {
47 int twiddle(int v) {
48 int t = v | (v - 1);
49 int w = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctz(v) + 1));
50 return w;
51 }
53 public:
54 vector<vector<int>> combine(int n, int k) {
55 vector<vector<int>> res;
56 vector<int> iter;
57 iter.reserve(k);
58 for (int mask = (1 << k) - 1; mask < 1 << n; mask = twiddle(mask)) {
59 for (int crnt = mask, idx; crnt; crnt ^= 1 << (idx - 1)) {
60 idx = __builtin_ffs(crnt);
61 iter.push_back(idx);
62 }
63 res.push_back(iter);
64 iter.clear();
65 }
66 return res;
67 }
68 };