Discover how a simple stack can solve a tricky water-trapping puzzle in just one pass!
Why Trapping Rain Water Using Stack in DSA Java?
Imagine you have a row of buildings with different heights, and after rain, water collects between them. You want to find out how much water is trapped. Trying to measure this by looking at each building and guessing the water trapped manually is tough and confusing.
Manually calculating trapped water means checking every building and comparing it with all others on the left and right to find the highest walls. This is slow and easy to mess up, especially with many buildings. It's like trying to count water drops between uneven walls by eye.
Using a stack helps keep track of buildings that can trap water. The stack stores building indexes, and when a taller building comes, it calculates trapped water with the help of the stack. This method is faster and less error-prone because it processes buildings in one pass.
int trappedWater = 0; for (int i = 1; i < heights.length - 1; i++) { int leftMax = 0, rightMax = 0; for (int j = 0; j <= i; j++) leftMax = Math.max(leftMax, heights[j]); for (int j = i; j < heights.length; j++) rightMax = Math.max(rightMax, heights[j]); trappedWater += Math.min(leftMax, rightMax) - heights[i]; }
Stack<Integer> stack = new Stack<>(); int trappedWater = 0, current = 0; while (current < heights.length) { while (!stack.isEmpty() && heights[current] > heights[stack.peek()]) { int top = stack.pop(); if (stack.isEmpty()) break; int distance = current - stack.peek() - 1; int boundedHeight = Math.min(heights[current], heights[stack.peek()]) - heights[top]; trappedWater += distance * boundedHeight; } stack.push(current++); }
This approach lets you quickly and accurately find trapped rainwater between buildings in just one pass, even for large inputs.
City planners can use this method to estimate how much rainwater will collect between buildings to design better drainage systems and prevent flooding.
Manual checking is slow and error-prone for large data.
Stack helps track boundaries and calculate trapped water efficiently.
One-pass solution saves time and reduces mistakes.
Practice
Trapping Rain Water Using Stack algorithm?Solution
Step 1: Understand the role of the stack
The stack stores indices of bars that are waiting to find a right boundary to trap water.Step 2: Explain how the stack helps in trapping water
When a bar taller than the top of the stack is found, it means water can be trapped between bars. The stack helps find the left boundary and calculate trapped water.Final Answer:
To keep track of the indices of bars that are not yet processed for water trapping -> Option AQuick Check:
Stack stores indices for trapping water = C [OK]
- Thinking stack stores heights instead of indices
- Assuming stack sorts bars by height
- Confusing stack use with reversing the array
Solution
Step 1: Check Java generic syntax for Stack
Java uses generics with angle brackets and wrapper classes like Integer, not primitive int.Step 2: Identify correct initialization
Correct syntax isStack<Integer> stack = new Stack<>();which uses Integer wrapper and diamond operator.Final Answer:
Stack<Integer> stack = new Stack<>(); -> Option BQuick Check:
Use wrapper Integer and diamond operator = A [OK]
- Using primitive int inside generics
- Omitting generic type causing raw type warning
- Incorrect constructor syntax with generics
int[] height = {0,1,0,2,1,0,1,3,2,1,2,1};
System.out.println(trap(height));
public static int trap(int[] height) {
Stack<Integer> stack = new Stack<>();
int water = 0, current = 0;
while (current < height.length) {
while (!stack.isEmpty() && height[current] > height[stack.peek()]) {
int top = stack.pop();
if (stack.isEmpty()) break;
int distance = current - stack.peek() - 1;
int boundedHeight = Math.min(height[current], height[stack.peek()]) - height[top];
water += distance * boundedHeight;
}
stack.push(current++);
}
return water;
}Solution
Step 1: Trace the stack and water calculation
The code uses a stack to find boundaries and calculates trapped water step-by-step for the given heights.Step 2: Calculate trapped water for given input
For the input array, the total trapped water calculated is 6 units after processing all bars.Final Answer:
6 -> Option CQuick Check:
Trapped water for given heights = 6 [OK]
- Miscounting distance between bars
- Incorrect bounded height calculation
- Forgetting to break when stack is empty
public static int trap(int[] height) {
Stack<Integer> stack = new Stack<>();
int water = 0, current = 0;
while (current <= height.length) {
while (!stack.isEmpty() && height[current] > height[stack.peek()]) {
int top = stack.pop();
if (stack.isEmpty()) break;
int distance = current - stack.peek() - 1;
int boundedHeight = Math.min(height[current], height[stack.peek()]) - height[top];
water += distance * boundedHeight;
}
stack.push(current++);
}
return water;
}Solution
Step 1: Identify the loop boundary error
The condition 'current <= height.length' causes an attempt to access height[height.length], which is out of bounds.Step 2: Fix the loop condition
Changing it to 'current < height.length' prevents the out-of-bounds error and allows correct iteration.Final Answer:
Change 'current <= height.length' to 'current < height.length' to avoid ArrayIndexOutOfBoundsException -> Option DQuick Check:
Loop boundary must be less than array length = A [OK]
- Using <= instead of < in loop condition
- Replacing stack with wrong data structure
- Removing necessary inner loop
height = {4, 2, 0, 3, 2, 5}, what is the total amount of trapped rain water calculated by the stack-based algorithm?Solution
Step 1: Analyze trapped water between bars
Between bars of height 4 and 5, water is trapped over lower bars: 2, 0, 3, 2.Step 2: Calculate trapped water volume
Water level is min(4,5)=4. Water trapped = (4-2) + (4-0) + (4-3) + (4-2) = 2 + 4 + 1 + 2 = 9 units.Final Answer:
9 -> Option AQuick Check:
Sum trapped water between boundaries = 9 [OK]
- Using left boundary height only
- Ignoring right boundary taller bar
- Adding heights instead of differences
Ready to prove it?
Pass the test and this pattern moves unknown
