mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-07-07 17:56:02 +08:00
refactor: redesign ArrayCombination
(#5181)
* Related to #5164 (Redesign of ArrayCombination) * Checkstyle fix * Clang_format * refactor: cleanup --------- Co-authored-by: Piotr Idzik <65706193+vil02@users.noreply.github.com> Co-authored-by: vil02 <vil02@o2.pl>
This commit is contained in:

committed by
GitHub

parent
06927d3fda
commit
f83bb659ba
@ -1,32 +1,42 @@
|
||||
package com.thealgorithms.backtracking;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
|
||||
/**
|
||||
* Finds all permutations of 1...n of length k
|
||||
* @author TheClerici (<a href="https://github.com/TheClerici">git-TheClerici</a>)
|
||||
* Finds all combinations of 0...n-1 of length k
|
||||
*/
|
||||
public final class ArrayCombination {
|
||||
private ArrayCombination() {
|
||||
}
|
||||
private static int length;
|
||||
|
||||
/**
|
||||
* Find all combinations of 1..n by creating an array and using backtracking in Combination.java
|
||||
* @param n max value of the array.
|
||||
* @param k length of combination
|
||||
* @return a list of all combinations of length k. If k == 0, return null.
|
||||
* Finds all combinations of length k of 0..n-1 using backtracking.
|
||||
*
|
||||
* @param n Number of the elements.
|
||||
* @param k Length of the combination.
|
||||
* @return A list of all combinations of length k.
|
||||
*/
|
||||
public static List<TreeSet<Integer>> combination(int n, int k) {
|
||||
if (n <= 0) {
|
||||
return null;
|
||||
public static List<List<Integer>> combination(int n, int k) {
|
||||
if (n < 0 || k < 0 || k > n) {
|
||||
throw new IllegalArgumentException("Wrong input.");
|
||||
}
|
||||
length = k;
|
||||
Integer[] arr = new Integer[n];
|
||||
for (int i = 1; i <= n; i++) {
|
||||
arr[i - 1] = i;
|
||||
|
||||
List<List<Integer>> combinations = new ArrayList<>();
|
||||
combine(combinations, new ArrayList<>(), 0, n, k);
|
||||
return combinations;
|
||||
}
|
||||
|
||||
private static void combine(List<List<Integer>> combinations, List<Integer> current, int start, int n, int k) {
|
||||
if (current.size() == k) { // Base case: combination found
|
||||
combinations.add(new ArrayList<>(current)); // Copy to avoid modification
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = start; i < n; i++) {
|
||||
current.add(i);
|
||||
combine(combinations, current, i + 1, n, k);
|
||||
current.removeLast(); // Backtrack
|
||||
}
|
||||
return Combination.combination(arr, length);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user