14
14
// [1,4],
15
15
// ]
16
16
//
17
- // Complexity: O(N!) time
18
- // Sol 1: combine(n, k) = combine(n-1, k-1) + combine(n-1, k)
19
- // Sol 2: combine(n, k) = join (1 ~ n-k+1) from k to 1
20
- // Sol 3: combine(n, k) = combine(n-1, k-1) + (n ~ k)
17
+ // Complexity:
18
+ // O(N!) time
21
19
// ============================================================================
22
20
21
+ #include < iostream>
23
22
#include < vector>
24
23
using namespace std ;
25
24
@@ -30,76 +29,43 @@ class Solution {
30
29
}
31
30
32
31
vector<vector<int > > combine1 (int n, int k) {
33
- vector<int > sub ;
32
+ vector<int > path ;
34
33
vector<vector<int > > res;
35
- combineHelper1 (n, k, 1 , sub , res);
34
+ combineHelper (n, k, 1 , path , res);
36
35
return res;
37
36
}
38
37
39
- void combineHelper1 (int n, int k, int s , vector<int > & sub , vector<vector<int > > & res) {
38
+ void combineHelper (int n, int k, int begin , vector<int > & path , vector<vector<int > > & res) {
40
39
if (k == 0 ) {
41
- res.push_back (sub );
40
+ res.push_back (path );
42
41
return ;
43
42
}
44
- for (int i = s; i <= n - k + 1 ; i++) {
45
- sub.push_back (i);
46
- combineHelper1 (n, k - 1 , i + 1 , sub, res);
47
- sub.pop_back ();
43
+ int end = n - k + 1 ;
44
+ for (int cur = begin; cur <= end; cur++) {
45
+ path.push_back (cur);
46
+ combineHelper (n, k - 1 , cur + 1 , path, res);
47
+ path.pop_back ();
48
48
}
49
49
}
50
50
51
51
vector<vector<int > > combine2 (int n, int k) {
52
- vector<vector<int > > res ( 1 , vector< int >()) ;
53
- for (; k > 0 ; k--){
52
+ vector<vector<int > > res;
53
+ for (; k > 0 ; k--) {
54
54
if (res.empty ()) {
55
- for (int i = 1 ; i <= n - k + 1 ; i ++) res.push_back (vector<int >(1 , i ));
55
+ for (int cur = 1 ; cur <= n - k + 1 ; cur ++) res.push_back (vector<int >(1 , cur ));
56
56
continue ;
57
57
}
58
-
59
- int N = res.size ();
60
- for (int i = 0 ; i < N; i++) {
61
- int j = res[i].back () + 1 ;
62
- for (; j < n - k + 1 ; j++) {
63
- vector<int > copy = res[i];
64
- copy.push_back (j);
65
- res.push_back (copy);
58
+ int M = res.size ();
59
+ for (int i = 0 ; i < M; i++) {
60
+ int begin = res[i].back () + 1 , end = n - k + 1 ;
61
+ for (int cur = begin; cur <= end; cur++){
62
+ if (cur == end) res[i].push_back (cur);
63
+ else {
64
+ auto copy = res[i];
65
+ copy.push_back (cur);
66
+ res.push_back (copy);
67
+ }
66
68
}
67
- res[i].push_back (j);
68
- }
69
- }
70
- return res;
71
- }
72
-
73
- vector<vector<int > > combine3 (int n, int k) {
74
- vector<int > sub;
75
- vector<vector<int > > res;
76
- combineHelper3 (n, k, 1 , sub, res);
77
- return res;
78
- }
79
-
80
- void combineHelper3 (int n, int k, int s, vector<int > & sub, vector<vector<int > > & res) {
81
- if (k == 0 ) {
82
- res.push_back (sub);
83
- return ;
84
- }
85
- if (s > n) return ;
86
- sub.push_back (s);
87
- combineHelper3 (n, k - 1 , s + 1 , sub, res);
88
- sub.pop_back ();
89
- combineHelper3 (n, k, s + 1 , sub, res);
90
- }
91
-
92
- vector<vector<int > > combine4 (int n, int k) {
93
- vector<vector<int > > res;
94
- if (k == 1 ) {
95
- for (int i = 1 ; i <= n; i++) res.push_back (vector<int >(1 , i));
96
- return res;
97
- }
98
- for (int i = n; i >= k; i--) {
99
- auto last = combine4 (i - 1 , k - 1 );
100
- for (auto it : last) {
101
- it.push_back (i);
102
- res.push_back (it);
103
69
}
104
70
}
105
71
return res;
0 commit comments