From 2d34bc150fe2e3a64bb750ed1174dac9e96bf46b Mon Sep 17 00:00:00 2001 From: Sanketh L Reddy <97825819+sankethl27@users.noreply.github.com> Date: Wed, 9 Oct 2024 19:27:11 +0530 Subject: [PATCH] Optimised Space Complexity To O(sum) (#5651) * Optimised Space Complexity To O(sum) * Fixes Clang Format * Optimised Space Complexity To Use a Single DP Array --- .../dynamicprogramming/SubsetSum.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSum.java b/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSum.java index 3dd41d2fd..da8667afd 100644 --- a/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSum.java +++ b/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSum.java @@ -9,28 +9,25 @@ public final class SubsetSum { * * @param arr the array containing integers. * @param sum the target sum of the subset. - * @return {@code true} if a subset exists that sums to the given value, otherwise {@code false}. + * @return {@code true} if a subset exists that sums to the given value, + * otherwise {@code false}. */ public static boolean subsetSum(int[] arr, int sum) { int n = arr.length; - boolean[][] isSum = new boolean[n + 1][sum + 1]; - // Initialize the first column to true since a sum of 0 can always be achieved with an empty subset. - for (int i = 0; i <= n; i++) { - isSum[i][0] = true; - } + // Initialize a single array to store the possible sums + boolean[] isSum = new boolean[sum + 1]; - // Fill the subset sum matrix - for (int i = 1; i <= n; i++) { - for (int j = 1; j <= sum; j++) { - if (arr[i - 1] <= j) { - isSum[i][j] = isSum[i - 1][j] || isSum[i - 1][j - arr[i - 1]]; - } else { - isSum[i][j] = isSum[i - 1][j]; - } + // Mark isSum[0] = true since a sum of 0 is always possible with 0 elements + isSum[0] = true; + + // Iterate through each Element in the array + for (int i = 0; i < n; i++) { + // Traverse the isSum array backwards to prevent overwriting values + for (int j = sum; j >= arr[i]; j--) { + isSum[j] = isSum[j] || isSum[j - arr[i]]; } } - - return isSum[n][sum]; + return isSum[sum]; } }