From 1be07c9336e9151acc5abbb6a2e7b5f85af8a3a0 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 20:47:43 +0530 Subject: [PATCH 1/8] Add Sliding Window algorithm and tests for maximum sum of subarray --- .../slidingwindow/maxSumKSizeSubarray.java | 44 +++++++++++ .../maxSumKSizeSubarrayTest.java | 78 +++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java create mode 100644 src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java diff --git a/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java b/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java new file mode 100644 index 000000000000..d3e0b7af0458 --- /dev/null +++ b/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java @@ -0,0 +1,44 @@ +package com.thealgorithms.slidingwindow; + +/** + * The Sliding Window algorithm is used to find the maximum sum of a subarray + * of a fixed size k within a given array. + * + *

+ * Worst-case performance O(n) + * Best-case performance O(n) + * Average performance O(n) + * Worst-case space complexity O(1) + * + * @author Your Name (https://github.com/Chiefpatwal) + */ +class SlidingWindow { + + /** + * This method finds the maximum sum of a subarray of a given size k. + * + * @param arr is the input array where the maximum sum needs to be found + * @param k is the size of the subarray + * @return the maximum sum of the subarray of size k, or -1 if the array length is less than k + */ + public static int maxSumKSizeSubarray(int[] arr, int k) { + if (arr.length < k) return -1; // Edge case: not enough elements + + int maxSum = 0; + int windowSum = 0; + + // Calculate the sum of the first window + for (int i = 0; i < k; i++) { + windowSum += arr[i]; + } + maxSum = windowSum; + + // Slide the window across the array + for (int i = k; i < arr.length; i++) { + windowSum += arr[i] - arr[i - k]; + maxSum = Math.max(maxSum, windowSum); + } + + return maxSum; + } +} diff --git a/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java b/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java new file mode 100644 index 000000000000..ef2f08c8a6e7 --- /dev/null +++ b/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java @@ -0,0 +1,78 @@ +package com.thealgorithms.slidingwindow; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +/** + * Unit tests for the SlidingWindow class. + * + * @author Your Name (https://github.com/Chiefpatwal) + */ +class SlidingWindowTest { + + /** + * Test for the basic case of finding the maximum sum. + */ + @Test + void testMaxSumKSizeSubarray() { + int[] arr = {1, 2, 3, 4, 5}; + int k = 2; + int expectedMaxSum = 9; // 4 + 5 + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + } + + /** + * Test for a different array and subarray size. + */ + @Test + void testMaxSumKSizeSubarrayWithDifferentValues() { + int[] arr = {2, 1, 5, 1, 3, 2}; + int k = 3; + int expectedMaxSum = 9; // 5 + 1 + 3 + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + } + + /** + * Test for edge case with insufficient elements. + */ + @Test + void testMaxSumKSizeSubarrayWithInsufficientElements() { + int[] arr = {1, 2}; + int k = 3; // Not enough elements + int expectedMaxSum = -1; // Edge case + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + } + + /** + * Test for large array. + */ + @Test + void testMaxSumKSizeSubarrayWithLargeArray() { + int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + int k = 5; + int expectedMaxSum = 40; // 6 + 7 + 8 + 9 + 10 + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + } + + /** + * Test for array with negative numbers. + */ + @Test + void testMaxSumKSizeSubarrayWithNegativeNumbers() { + int[] arr = {-1, -2, -3, -4, -5}; + int k = 2; + int expectedMaxSum = -3; // -1 + -2 + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + } + + /** + * Test for the case where k equals the array length. + */ + @Test + void testMaxSumKSizeSubarrayWithKEqualToArrayLength() { + int[] arr = {1, 2, 3, 4, 5}; + int k = 5; + int expectedMaxSum = 15; // 1 + 2 + 3 + 4 + 5 + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + } +} From 780de0b326ea6e3160a9b278363cbf3136a9e30c Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 21:11:06 +0530 Subject: [PATCH 2/8] Formatted maxSumKSizeSubarrayTest with clang-format --- .../slidingwindow/maxSumKSizeSubarrayTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java b/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java index ef2f08c8a6e7..2489412b9ade 100644 --- a/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java +++ b/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java @@ -1,6 +1,7 @@ package com.thealgorithms.slidingwindow; import static org.junit.jupiter.api.Assertions.assertEquals; + import org.junit.jupiter.api.Test; /** @@ -40,7 +41,7 @@ void testMaxSumKSizeSubarrayWithInsufficientElements() { int[] arr = {1, 2}; int k = 3; // Not enough elements int expectedMaxSum = -1; // Edge case - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); } /** @@ -62,7 +63,7 @@ void testMaxSumKSizeSubarrayWithNegativeNumbers() { int[] arr = {-1, -2, -3, -4, -5}; int k = 2; int expectedMaxSum = -3; // -1 + -2 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); } /** @@ -73,6 +74,6 @@ void testMaxSumKSizeSubarrayWithKEqualToArrayLength() { int[] arr = {1, 2, 3, 4, 5}; int k = 5; int expectedMaxSum = 15; // 1 + 2 + 3 + 4 + 5 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); } } From 59dd4941ca67fc4ee2c5f95d6483cea162423dfa Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 21:16:08 +0530 Subject: [PATCH 3/8] Your commit message here --- .../slidingwindow/maxSumKSizeSubarray.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java b/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java index d3e0b7af0458..f4211d16a9a7 100644 --- a/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java +++ b/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java @@ -12,17 +12,23 @@ * * @author Your Name (https://github.com/Chiefpatwal) */ -class SlidingWindow { +class MaxSumKSizeSubarray { + + // Prevent instantiation + private MaxSumKSizeSubarray() { + } /** * This method finds the maximum sum of a subarray of a given size k. * * @param arr is the input array where the maximum sum needs to be found * @param k is the size of the subarray - * @return the maximum sum of the subarray of size k, or -1 if the array length is less than k + * @return the maximum sum of the subarray of size k */ - public static int maxSumKSizeSubarray(int[] arr, int k) { - if (arr.length < k) return -1; // Edge case: not enough elements + public static int max_sum_k_size_subarray(int[] arr, int k) { + if (arr.length < k) { + return -1; // Edge case: not enough elements + } int maxSum = 0; int windowSum = 0; From 6b5b5631b10bf9fc7f11d1e0d0f2e9b82c6896b4 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 21:36:47 +0530 Subject: [PATCH 4/8] Refactor Sliding Window algorithm implementation and tests --- ...izeSubarray.java => MaxSumKSizeSubarray.java} | 8 ++++---- ...rayTest.java => MaxSumKSizeSubarrayTest.java} | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) rename src/main/java/com/thealgorithms/slidingwindow/{maxSumKSizeSubarray.java => MaxSumKSizeSubarray.java} (87%) rename src/test/java/com/thealgorithms/slidingwindow/{maxSumKSizeSubarrayTest.java => MaxSumKSizeSubarrayTest.java} (73%) diff --git a/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java b/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java similarity index 87% rename from src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java rename to src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java index f4211d16a9a7..fda2652ff574 100644 --- a/src/main/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarray.java +++ b/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java @@ -12,7 +12,7 @@ * * @author Your Name (https://github.com/Chiefpatwal) */ -class MaxSumKSizeSubarray { +public class MaxSumKSizeSubarray { // Prevent instantiation private MaxSumKSizeSubarray() { @@ -22,15 +22,15 @@ private MaxSumKSizeSubarray() { * This method finds the maximum sum of a subarray of a given size k. * * @param arr is the input array where the maximum sum needs to be found - * @param k is the size of the subarray + * @param k is the size of the subarray * @return the maximum sum of the subarray of size k */ - public static int max_sum_k_size_subarray(int[] arr, int k) { + public static int maxSumKSizeSubarray(int[] arr, int k) { if (arr.length < k) { return -1; // Edge case: not enough elements } - int maxSum = 0; + int maxSum ; int windowSum = 0; // Calculate the sum of the first window diff --git a/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java b/src/test/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarrayTest.java similarity index 73% rename from src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java rename to src/test/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarrayTest.java index 2489412b9ade..aa3c2eae3294 100644 --- a/src/test/java/com/thealgorithms/slidingwindow/maxSumKSizeSubarrayTest.java +++ b/src/test/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarrayTest.java @@ -5,11 +5,11 @@ import org.junit.jupiter.api.Test; /** - * Unit tests for the SlidingWindow class. + * Unit tests for the MaxSumKSizeSubarray class. * * @author Your Name (https://github.com/Chiefpatwal) */ -class SlidingWindowTest { +class MaxSumKSizeSubarrayTest { /** * Test for the basic case of finding the maximum sum. @@ -19,7 +19,7 @@ void testMaxSumKSizeSubarray() { int[] arr = {1, 2, 3, 4, 5}; int k = 2; int expectedMaxSum = 9; // 4 + 5 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, MaxSumKSizeSubarray.maxSumKSizeSubarray(arr, k)); } /** @@ -30,7 +30,7 @@ void testMaxSumKSizeSubarrayWithDifferentValues() { int[] arr = {2, 1, 5, 1, 3, 2}; int k = 3; int expectedMaxSum = 9; // 5 + 1 + 3 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, MaxSumKSizeSubarray.maxSumKSizeSubarray(arr, k)); } /** @@ -41,7 +41,7 @@ void testMaxSumKSizeSubarrayWithInsufficientElements() { int[] arr = {1, 2}; int k = 3; // Not enough elements int expectedMaxSum = -1; // Edge case - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, MaxSumKSizeSubarray.maxSumKSizeSubarray(arr, k)); } /** @@ -52,7 +52,7 @@ void testMaxSumKSizeSubarrayWithLargeArray() { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int k = 5; int expectedMaxSum = 40; // 6 + 7 + 8 + 9 + 10 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, MaxSumKSizeSubarray.maxSumKSizeSubarray(arr, k)); } /** @@ -63,7 +63,7 @@ void testMaxSumKSizeSubarrayWithNegativeNumbers() { int[] arr = {-1, -2, -3, -4, -5}; int k = 2; int expectedMaxSum = -3; // -1 + -2 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, MaxSumKSizeSubarray.maxSumKSizeSubarray(arr, k)); } /** @@ -74,6 +74,6 @@ void testMaxSumKSizeSubarrayWithKEqualToArrayLength() { int[] arr = {1, 2, 3, 4, 5}; int k = 5; int expectedMaxSum = 15; // 1 + 2 + 3 + 4 + 5 - assertEquals(expectedMaxSum, SlidingWindow.maxSumKSizeSubarray(arr, k)); + assertEquals(expectedMaxSum, MaxSumKSizeSubarray.maxSumKSizeSubarray(arr, k)); } } From ec26f9a621ff7703eaa542909059cfdb4372b055 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 21:46:33 +0530 Subject: [PATCH 5/8] updated --- .../com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java b/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java index fda2652ff574..3e92d7fbf032 100644 --- a/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java +++ b/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java @@ -30,7 +30,7 @@ public static int maxSumKSizeSubarray(int[] arr, int k) { return -1; // Edge case: not enough elements } - int maxSum ; + int maxSum; int windowSum = 0; // Calculate the sum of the first window From 02a29346f3acad8f15f80bafa397bb9a9f6179a8 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 21:52:12 +0530 Subject: [PATCH 6/8] updated --- .../com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java b/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java index 3e92d7fbf032..7e8095e08a0b 100644 --- a/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java +++ b/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java @@ -12,7 +12,7 @@ * * @author Your Name (https://github.com/Chiefpatwal) */ -public class MaxSumKSizeSubarray { +public final class MaxSumKSizeSubarray { // Prevent instantiation private MaxSumKSizeSubarray() { From 7edc96b6eaa4050eee2eebc86c465d242bbf42d3 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 23:41:55 +0530 Subject: [PATCH 7/8] Implement Longest Substring Without Repeating Characters --- ...stSubstringWithoutRepeatingCharacters.java | 47 +++++++++++++++++++ ...bstringWithoutRepeatingCharactersTest.java | 22 +++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java create mode 100644 src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java diff --git a/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java b/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java new file mode 100644 index 000000000000..2d71824e00b4 --- /dev/null +++ b/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java @@ -0,0 +1,47 @@ +package com.thealgorithms.slidingwindow; +import java.util.HashSet; + + +/** + * The Longest Substring Without Repeating Characters algorithm finds the length of + * the longest substring without repeating characters in a given string. + * + *

+ * Worst-case performance O(n) + * Best-case performance O(n) + * Average performance O(n) + * Worst-case space complexity O(min(n, m)), where n is the length of the string + * and m is the size of the character set. + * + * @author (https://github.com/Chiefpatwal) + */ +public final class LongestSubstringWithoutRepeatingCharacters { + + // Prevent instantiation + private LongestSubstringWithoutRepeatingCharacters() { + } + + /** + * This method finds the length of the longest substring without repeating characters. + * + * @param s is the input string + * @return the length of the longest substring without repeating characters + */ + public static int lengthOfLongestSubstring(String s) { + int maxLength = 0; + int left = 0; + HashSet charSet = new HashSet<>(); + + for (int right = 0; right < s.length(); right++) { + // If the character is already in the set, remove characters from the left + while (charSet.contains(s.charAt(right))) { + charSet.remove(s.charAt(left)); + left++; + } + charSet.add(s.charAt(right)); + maxLength = Math.max(maxLength, right - left + 1); + } + + return maxLength; + } +} diff --git a/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java b/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java new file mode 100644 index 000000000000..faeaad33fd7d --- /dev/null +++ b/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java @@ -0,0 +1,22 @@ +package com.thealgorithms.slidingwindow; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Unit tests for the LongestSubstringWithoutRepeatingCharacters class. + * + * @author (https://github.com/Chiefpatwal) + */ +public class LongestSubstringWithoutRepeatingCharactersTest { + + @Test + public void testLengthOfLongestSubstring() { + // Test cases for the lengthOfLongestSubstring method + assertEquals(3, LongestSubstringWithoutRepeatingCharacters.lengthOfLongestSubstring("abcabcbb")); + assertEquals(1, LongestSubstringWithoutRepeatingCharacters.lengthOfLongestSubstring("bbbbb")); + assertEquals(3, LongestSubstringWithoutRepeatingCharacters.lengthOfLongestSubstring("pwwkew")); + assertEquals(0, LongestSubstringWithoutRepeatingCharacters.lengthOfLongestSubstring("")); + assertEquals(5, LongestSubstringWithoutRepeatingCharacters.lengthOfLongestSubstring("abcde")); + } +} From dbfa9d38942aaa21a40e63f613a798f23acabcf1 Mon Sep 17 00:00:00 2001 From: Chiefpatwal Date: Fri, 25 Oct 2024 23:49:37 +0530 Subject: [PATCH 8/8] added another algorithm --- .../LongestSubstringWithoutRepeatingCharacters.java | 1 - .../LongestSubstringWithoutRepeatingCharactersTest.java | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java b/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java index 2d71824e00b4..0641730d8b09 100644 --- a/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java +++ b/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java @@ -1,7 +1,6 @@ package com.thealgorithms.slidingwindow; import java.util.HashSet; - /** * The Longest Substring Without Repeating Characters algorithm finds the length of * the longest substring without repeating characters in a given string. diff --git a/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java b/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java index faeaad33fd7d..8638a707a3e2 100644 --- a/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java +++ b/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java @@ -1,8 +1,9 @@ package com.thealgorithms.slidingwindow; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + /** * Unit tests for the LongestSubstringWithoutRepeatingCharacters class. *