diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java new file mode 100644 index 0000000000..932ded5018 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithm.java @@ -0,0 +1,35 @@ +package com.baeldung.algorithms.maximumsubarray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BruteForceAlgorithm { + + private Logger logger = LoggerFactory.getLogger(BruteForceAlgorithm.class.getName()); + + public int maxSubArray(int[] arr) { + + int size = arr.length; + int maximumSubArraySum = Integer.MIN_VALUE; + int start = 0; + int end = 0; + + for (int left = 0; left < size; left++) { + + int runningWindowSum = 0; + + for (int right = left; right < size; right++) { + runningWindowSum += arr[right]; + + if (runningWindowSum > maximumSubArraySum) { + maximumSubArraySum = runningWindowSum; + start = left; + end = right; + } + } + } + logger.info("Found Maximum Subarray between {} and {}", start, end); + return maximumSubArraySum; + } + +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java new file mode 100644 index 0000000000..0aaa1b6c23 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithm.java @@ -0,0 +1,34 @@ +package com.baeldung.algorithms.maximumsubarray; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class KadaneAlgorithm { + + private Logger logger = LoggerFactory.getLogger(BruteForceAlgorithm.class.getName()); + + public int maxSubArraySum(int[] arr) { + + int size = arr.length; + int start = 0; + int end = 0; + + int maxSoFar = 0, maxEndingHere = 0; + + for (int i = 0; i < size; i++) { + + if (arr[i] > maxEndingHere + arr[i]) { + start = i; + maxEndingHere = arr[i]; + } else + maxEndingHere = maxEndingHere + arr[i]; + + if (maxSoFar < maxEndingHere) { + maxSoFar = maxEndingHere; + end = i; + } + } + logger.info("Found Maximum Subarray between {} and {}", start, end); + return maxSoFar; + } +} diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java new file mode 100644 index 0000000000..b818046b2a --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/BruteForceAlgorithmUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.algorithms.maximumsubarray; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BruteForceAlgorithmUnitTest { + + @Test + void givenArrayWithNegativeNumberWhenMaximumSubarrayThenReturns6() { + //given + int[] arr = new int[]{-3, 1, -8, 4, -1, 2, 1, -5, 5}; + //when + BruteForceAlgorithm algorithm = new BruteForceAlgorithm(); + int maximumSum = algorithm.maxSubArray(arr); + //then + assertEquals(6, maximumSum); + } +} \ No newline at end of file diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java new file mode 100644 index 0000000000..9bece56f5b --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/maximumsubarray/KadaneAlgorithmUnitTest.java @@ -0,0 +1,19 @@ +package com.baeldung.algorithms.maximumsubarray; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class KadaneAlgorithmUnitTest { + + @Test + void givenArrayWithNegativeNumberWhenMaximumSubarrayThenReturns6() { + //given + int[] arr = new int[]{-3, 1, -8, 4, -1, 2, 1, -5, 5}; + //when + KadaneAlgorithm algorithm = new KadaneAlgorithm(); + int maxSum = algorithm.maxSubArraySum(arr); + //then + assertEquals(6, maxSum); + } +} \ No newline at end of file