From 3e85586939d8c626b50bcfc892cb8554439ace59 Mon Sep 17 00:00:00 2001 From: Matin-Ardestani Date: Wed, 22 Apr 2026 22:43:25 +0330 Subject: [PATCH] Implement intPartitions method --- src/main/java/MainExercises.java | 60 ++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/src/main/java/MainExercises.java b/src/main/java/MainExercises.java index 2d9b518..2ede0f1 100644 --- a/src/main/java/MainExercises.java +++ b/src/main/java/MainExercises.java @@ -1,3 +1,5 @@ +import java.util.ArrayList; + public class MainExercises { /* @@ -145,8 +147,62 @@ public class MainExercises */ public int[][] intPartitions(int n) { - // todo - return null; + + ArrayList result = new ArrayList<>(); + int[] current = new int[n]; // current partition, to be built + + // we use stack arrays to have the situation saved. + int[] remainingStack = new int[n*n]; // remaining value, to be added +// int[] maxValueStack = new int[n*n]; // maximum number we can use, to prevent repeating partitions + int[] nextTryStack = new int[n*n]; // the next number we try + int[] lenStack = new int[n*n]; // length of current partition, gives us the next index in current + int head = 0; // works like a pointer, it makes stack arrays make sense. + + remainingStack[0] = n; +// maxValueStack[0] = n; + nextTryStack[0] = n; + lenStack[0] = 0; + + while(head >= 0){ + int remaining = remainingStack[head]; +// int maxValue = maxValueStack[head]; + int nextTry = nextTryStack[head]; + int partitionLen = lenStack[head]; + + if(remaining == 0){ // partition has been completed + // + int[] partition = new int[partitionLen]; + System.arraycopy(current, 0, partition, 0, partitionLen); + result.add(partition); + head--; + continue; + } + + if(nextTry <= 0){ // no choices left + head--; + continue; + } + + int chosen = nextTry; + nextTryStack[head] = chosen - 1; // next value to be tried + current[partitionLen] = chosen; // adding selected number + + // generating next number for the partition + head++; + remainingStack[head] = remaining - chosen; +// maxValueStack[head] = chosen; + nextTryStack[head] = Math.min(chosen, remaining - chosen); + lenStack[head] = partitionLen + 1; + + } + + int[][] output = new int[result.size()][]; + for(int i = 0; i < result.size(); i++){ + output[i] = result.get(i); + } + + return output; + }