diff --git a/DIRECTORY.md b/DIRECTORY.md index 36989c416513..69dbdca0a3b9 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) @@ -578,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) @@ -695,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) 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..ecb339d33901 --- /dev/null +++ b/src/test/java/com/thealgorithms/dynamicprogramming/TrappedRainWaterTest.java @@ -0,0 +1,22 @@ +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), Arguments.of(null, 0), // Test case for null input + Arguments.of(new int[] {}, 0)); + } +}