12
12
13
13
def combination_lists (n : int , k : int ) -> list [list [int ]]:
14
14
"""
15
+ Generates all possible combinations of k numbers out of 1 ... n using itertools.
16
+
15
17
>>> combination_lists(n=4, k=2)
16
18
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
19
+ >>> combination_lists(n=5, k=3)
20
+ [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5]]
21
+ >>> combination_lists(n=0, k=0)
22
+ []
23
+ >>> combination_lists(n=1, k=1)
24
+ [[1]]
25
+ >>> combination_lists(n=3, k=0)
26
+ []
27
+ >>> combination_lists(n=3, k=4)
28
+ []
29
+ >>> combination_lists(n=-1, k=2)
30
+ []
31
+ >>> combination_lists(n=4, k=-1)
32
+ []
17
33
"""
18
34
return [list (x ) for x in combinations (range (1 , n + 1 ), k )]
19
35
20
36
21
37
def generate_all_combinations (n : int , k : int ) -> list [list [int ]]:
22
38
"""
39
+ Generates all possible combinations of k numbers out of 1 ... n using backtracking.
40
+
23
41
>>> generate_all_combinations(n=4, k=2)
24
42
[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
25
43
>>> generate_all_combinations(n=0, k=0)
@@ -34,6 +52,14 @@ def generate_all_combinations(n: int, k: int) -> list[list[int]]:
34
52
ValueError: n must not be negative
35
53
>>> generate_all_combinations(n=5, k=4)
36
54
[[1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]]
55
+ >>> generate_all_combinations(n=3, k=3)
56
+ [[1, 2, 3]]
57
+ >>> generate_all_combinations(n=3, k=1)
58
+ [[1], [2], [3]]
59
+ >>> generate_all_combinations(n=1, k=0)
60
+ [[]]
61
+ >>> generate_all_combinations(n=1, k=1)
62
+ [[1]]
37
63
>>> from itertools import combinations
38
64
>>> all(generate_all_combinations(n, k) == combination_lists(n, k)
39
65
... for n in range(1, 6) for k in range(1, 6))
@@ -56,6 +82,28 @@ def create_all_state(
56
82
current_list : list [int ],
57
83
total_list : list [list [int ]],
58
84
) -> None :
85
+ """
86
+ Helper function to recursively build all combinations.
87
+
88
+ >>> create_all_state(1, 4, 2, [], result := [])
89
+ >>> result
90
+ [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
91
+ >>> create_all_state(1, 3, 3, [], result := [])
92
+ >>> result
93
+ [[1, 2, 3]]
94
+ >>> create_all_state(2, 2, 1, [1], result := [])
95
+ >>> result
96
+ [[1, 2]]
97
+ >>> create_all_state(1, 0, 0, [], result := [])
98
+ >>> result
99
+ [[]]
100
+ >>> create_all_state(1, 4, 0, [1, 2], result := [])
101
+ >>> result
102
+ [[1, 2]]
103
+ >>> create_all_state(5, 4, 2, [1, 2], result := [])
104
+ >>> result
105
+ []
106
+ """
59
107
if level == 0 :
60
108
total_list .append (current_list [:])
61
109
return
0 commit comments