-
Notifications
You must be signed in to change notification settings - Fork 21
/
Combinations.js
130 lines (122 loc) 路 2.66 KB
/
Combinations.js
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/**
* Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
*
* For example,
* If n = 4 and k = 2, a solution is:
*
* [
* [2,4],
* [3,4],
* [2,3],
* [1,2],
* [1,3],
* [1,4],
* ]
*/
/**
* Iterative solution.
*
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
let combine = function (n, k) {
let results = [];
if (n === 0 || k === 0 || k > n) {
return results;
}
for (let i = 1; i <= n + 1 - k; i++) {
results.push([i]);
}
for (let i = 2; i <= k; i++) {
let tmp = [];
results.forEach(function (list) {
for (let m = list[list.length - 1] + 1; m <= n - (k - i); m++) {
let newList = [];
list.forEach(function (element) {
newList.push(element);
});
newList.push(m);
tmp.push(newList);
}
});
results = tmp;
}
return results;
};
/**
* Recursive solution.
* Time Limit Exceeded.
*
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
/*let combine = function (n, k) {
let results = [];
if (n === 0 || k === 0 || k > n) {
return results;
}
if (k === 1) {
for (let i = 1; i <= n; i++) {
let list = [];
list.push(i);
results.push(list);
}
return results;
}
combine(n, k - 1).forEach(function (list) {
for (let i = list[list.length - 1]; i < n; i++) {
let tmp = [];
list.forEach(function (a) {
tmp.push(a);
});
tmp.push(i + 1);
results.push(tmp);
}
});
return results;
};*/
if (combine(2, 0).length === 0) {
console.log("pass")
} else {
console.error("failed")
}
let list0 = combine(2, 1);
let tmp = new Set([[1], [2]]);
if (list0.length === 2) {
console.log("pass")
} else {
console.error("failed")
}
if (new Set(list0).toString() === tmp.toString()) {
console.log("pass")
} else {
console.error("failed")
}
tmp.clear();
let list1 = combine(4, 2);
tmp.add([[2, 4], [3, 4], [2, 3], [1, 2], [1, 3], [1, 4]]);
if (list1.length === 6) {
console.log("pass")
} else {
console.error("failed")
}
if (new Set(list1).toString() === tmp.toString()) {
console.log("pass")
} else {
console.error("failed")
}
tmp.clear();
let list2 = combine(4, 3);
tmp.add([[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]);
if (list2.length === 4) {
console.log("pass")
} else {
console.error("failed")
}
if (new Set(list2).toString() === tmp.toString()) {
console.log("pass")
} else {
console.error("failed")
}