From 9a8aadf12556dcbe9d7a49a1e41f7aa2c6a4aa31 Mon Sep 17 00:00:00 2001 From: chirag d Date: Mon, 2 Dec 2019 19:52:17 +0530 Subject: [PATCH] BAEL3455 Maximum Subarray Problem --- .../subarray/maximum/BruteForceAlgorithm.java | 30 +++++++++++++++++++ .../subarray/maximum/KadaneAlgorithm.java | 29 ++++++++++++++++++ .../maximum/BruteForceAlgorithmUnitTest.java | 24 +++++++++++++++ .../maximum/KadaneAlgorithmUnitTest.java | 23 ++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithm.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithm.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithmUnitTest.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithmUnitTest.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithm.java new file mode 100644 index 0000000000..fcf404af88 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithm.java @@ -0,0 +1,30 @@ +package com.baeldung.algorithms.subarray.maximum; + +public class BruteForceAlgorithm { + + 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; + } + } + } + System.out.println("Found Maximum Subarray between " + start + " and " + end); + return maximumSubArraySum; + } + +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithm.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithm.java new file mode 100644 index 0000000000..98b121108c --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithm.java @@ -0,0 +1,29 @@ +package com.baeldung.algorithms.subarray.maximum; + +public class KadaneAlgorithm { + + 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; + } + } + System.out.println("Found Maximum Subarray between " + start + " and " + end); + return maxSoFar; + } +} diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithmUnitTest.java new file mode 100644 index 0000000000..3a66c6b5d6 --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/BruteForceAlgorithmUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.algorithms.subarray.maximum; + +import org.junit.jupiter.api.Assertions; +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/subarray/maximum/KadaneAlgorithmUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithmUnitTest.java new file mode 100644 index 0000000000..38afa5c871 --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/subarray/maximum/KadaneAlgorithmUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.algorithms.subarray.maximum; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +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