Skip to content

Commit 5e93f92

Browse files
committed
Combination with repetition added
1 parent e0e7250 commit 5e93f92

File tree

2 files changed

+93
-1
lines changed

2 files changed

+93
-1
lines changed

AlgorithmCode/ArraysToBST.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static void main(String[] args) {
1616
4
1717
2 6
1818
1 3 5 7
19-
*/
19+
*/s
2020

2121
public static void dfs (Node current) {
2222
if (current == null)
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/**
2+
* Here I show how you can generate all the combinations of a sequence of size r which are repeated
3+
* at most k times.
4+
*
5+
* <p>Time Complexity: O(n+r-1 choose r) = O((n+r-1)!/(r!(n-1)!))
6+
*
7+
* @author William Fiset, william.alexandre.fiset@gmail.com
8+
*/
9+
package com.williamfiset.algorithms.other;
10+
11+
public class CombinationsWithRepetition {
12+
13+
/**
14+
* Computes all combinations of elements of 'r' elements which can be repeated at most 'k' times
15+
* each.
16+
*
17+
* @param sequence - The sequence containing all the elements we wish to take combinations from
18+
* @param usedCount - Tracks how many of each element we currently have selected
19+
* @param at - The current position we're at in the sequence
20+
* @param r - The number of elements we're choosing
21+
* @param k - The maximum number of times each element is allowed to be picked
22+
*/
23+
private static void combinationsWithRepetition(
24+
int[] sequence, int[] usedCount, int at, int r, int k) {
25+
26+
final int N = sequence.length;
27+
28+
// We reached the end
29+
if (at == N) {
30+
31+
// We selected 'r' elements in total
32+
if (r == 0) {
33+
34+
// Print combination
35+
System.out.print("{ ");
36+
for (int i = 0; i < N; i++)
37+
for (int j = 0; j < usedCount[i]; j++) System.out.print(sequence[i] + " ");
38+
System.out.println("}");
39+
}
40+
41+
} else {
42+
43+
// For this particular time at position 'at' try including it each of [0, k] times
44+
for (int itemCount = 0; itemCount <= k; itemCount++) {
45+
46+
// Try including this element itemCount number of times (this is possibly more than once)
47+
usedCount[at] = itemCount;
48+
49+
combinationsWithRepetition(sequence, usedCount, at + 1, r - itemCount, k);
50+
}
51+
}
52+
}
53+
54+
// Given a sequence this method prints all the combinations of size
55+
// 'r' in a given sequence which has each element repeated at most 'k' times
56+
public static void printCombinationsWithRepetition(int[] sequence, int r, int k) {
57+
58+
if (sequence == null) return;
59+
final int n = sequence.length;
60+
if (r > n) throw new IllegalArgumentException("r must be <= n");
61+
if (k > r) throw new IllegalArgumentException("k must be <= r");
62+
63+
int[] usedCount = new int[sequence.length];
64+
combinationsWithRepetition(sequence, usedCount, 0, r, k);
65+
}
66+
67+
public static void main(String[] args) {
68+
69+
// Prints all combinations of size 3 where
70+
// each element is repeated at most twice
71+
int[] seq = {1, 2, 3, 4};
72+
printCombinationsWithRepetition(seq, 3, 2);
73+
// prints:
74+
// { 3 4 4 }
75+
// { 3 3 4 }
76+
// { 2 4 4 }
77+
// { 2 3 4 }
78+
// { 2 3 3 }
79+
// { 2 2 4 }
80+
// { 2 2 3 }
81+
// { 1 4 4 }
82+
// { 1 3 4 }
83+
// { 1 3 3 }
84+
// { 1 2 4 }
85+
// { 1 2 3 }
86+
// { 1 2 2 }
87+
// { 1 1 4 }
88+
// { 1 1 3 }
89+
// { 1 1 2 }
90+
91+
}
92+
}

0 commit comments

Comments
 (0)