From 055842cb9ee9b4445b857624af08a8db912f528a Mon Sep 17 00:00:00 2001 From: Truong Nhan Nguyen Date: Sat, 6 Apr 2024 16:46:15 +0700 Subject: [PATCH 1/4] chore: add `TrappedRainWater.java` to DIRECTORY.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 36989c416513..01a5eb04f5d4 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -250,6 +250,7 @@ * [SubsetCount](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SubsetCount.java) * [SubsetSum](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SubsetSum.java) * [SumOfSubset](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/SumOfSubset.java) + * [TrappedRainWater](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/TrappedRainWater.java) * [Tribonacci](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/Tribonacci.java) * [UniquePaths](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/UniquePaths.java) * [WildcardMatching](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/dynamicprogramming/WildcardMatching.java) From 6dc72ac957fcaadab5ce132b97a484282b406dff Mon Sep 17 00:00:00 2001 From: Truong Nhan Nguyen Date: Sat, 6 Apr 2024 16:46:43 +0700 Subject: [PATCH 2/4] feat: implement Trapped Rain Water algorithm --- .../dynamicprogramming/TrappedRainWater.java | 42 +++++++++++++++++++ .../TrappedRainWaterTest.java | 21 ++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/main/java/com/thealgorithms/dynamicprogramming/TrappedRainWater.java create mode 100644 src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java diff --git a/src/main/java/com/thealgorithms/dynamicprogramming/TrappedRainWater.java b/src/main/java/com/thealgorithms/dynamicprogramming/TrappedRainWater.java new file mode 100644 index 000000000000..1ca21189ebdd --- /dev/null +++ b/src/main/java/com/thealgorithms/dynamicprogramming/TrappedRainWater.java @@ -0,0 +1,42 @@ +package com.thealgorithms.dynamicprogramming; + +/** + * Utility class for calculating the amount of trapped rainwater between blocks. + */ +public final class TrappedRainWater { + private TrappedRainWater() { + } + + /** + * Calculates the amount of trapped rainwater between blocks given their heights. + * + * @param height An array representing the heights of blocks. + * @return The total amount of trapped rainwater. + */ + public static int trap(final int[] height) { + if (height == null || height.length == 0) return 0; + + int left = 0; + int right = height.length - 1; + int leftMax = 0; + int rightMax = 0; + int trappedWater = 0; + + while (left < right) { + if (height[left] < height[right]) { + if (height[left] >= leftMax) + leftMax = height[left]; + else + trappedWater += leftMax - height[left]; + left++; + } else { + if (height[right] >= rightMax) + rightMax = height[right]; + else + trappedWater += rightMax - height[right]; + right--; + } + } + return trappedWater; + } +} diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java new file mode 100644 index 000000000000..f027b9bce28c --- /dev/null +++ b/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java @@ -0,0 +1,21 @@ +package com.thealgorithms.dynamicprogramming; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class TrappedRainWaterTest { + @ParameterizedTest + @MethodSource("testCases") + void testTrappedRainWater(int[] heights, int expected) { + assertEquals(expected, TrappedRainWater.trap(heights)); + } + + private static Stream testCases() { + return Stream.of( + Arguments.of(new int[] {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, 6), Arguments.of(new int[] {0, 2, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, 7), Arguments.of(new int[] {4, 2, 0, 3, 2, 5}, 9), Arguments.of(new int[] {3, 2, 1, 0, 1, 2, 3}, 9), Arguments.of(new int[] {5, 4, 3, 2, 1, 2, 3, 4, 5}, 16)); + } +} From 7f9b561265fb5483f117396a9b9a9c0f2f450e01 Mon Sep 17 00:00:00 2001 From: TruongNhanNguyen Date: Sun, 7 Apr 2024 00:28:05 +0000 Subject: [PATCH 3/4] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 01a5eb04f5d4..69dbdca0a3b9 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -579,6 +579,7 @@ * [FloodFillTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/FloodFillTest.java) * [MazeRecursionTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/MazeRecursionTest.java) * [MColoringTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/MColoringTest.java) + * [ParenthesesGeneratorTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/ParenthesesGeneratorTest.java) * [PermutationTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/PermutationTest.java) * [PowerSumTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/PowerSumTest.java) * [WordSearchTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/backtracking/WordSearchTest.java) @@ -696,6 +697,7 @@ * [PartitionProblemTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/PartitionProblemTest.java) * [SubsetCountTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/SubsetCountTest.java) * [SumOfSubsetTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/SumOfSubsetTest.java) + * [TrappedRainWaterTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java) * [TribonacciTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/TribonacciTest.java) * [UniquePathsTests](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/UniquePathsTests.java) * [WildcardMatchingTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/dynamicprogramming/WildcardMatchingTest.java) From 21a5191c3dd8fd9705849e48e0b975a85043d31c Mon Sep 17 00:00:00 2001 From: Truong Nhan Nguyen Date: Sun, 7 Apr 2024 08:09:15 +0700 Subject: [PATCH 4/4] ref(tests): add coverage tests when input is null or empty --- .../dynamicprogramming/TrappedRainWaterTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java b/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java index f027b9bce28c..ecb339d33901 100644 --- a/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java +++ b/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java @@ -15,7 +15,8 @@ void testTrappedRainWater(int[] heights, int expected) { } private static Stream testCases() { - return Stream.of( - Arguments.of(new int[] {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, 6), Arguments.of(new int[] {0, 2, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, 7), Arguments.of(new int[] {4, 2, 0, 3, 2, 5}, 9), Arguments.of(new int[] {3, 2, 1, 0, 1, 2, 3}, 9), Arguments.of(new int[] {5, 4, 3, 2, 1, 2, 3, 4, 5}, 16)); + return Stream.of(Arguments.of(new int[] {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, 6), Arguments.of(new int[] {0, 2, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}, 7), Arguments.of(new int[] {4, 2, 0, 3, 2, 5}, 9), Arguments.of(new int[] {3, 2, 1, 0, 1, 2, 3}, 9), + Arguments.of(new int[] {5, 4, 3, 2, 1, 2, 3, 4, 5}, 16), Arguments.of(null, 0), // Test case for null input + Arguments.of(new int[] {}, 0)); } }