Discover how a simple stack can solve a tricky water trapping puzzle in just one pass!
Why Trapping Rain Water Using Stack in DSA C#?
Imagine you have a row of walls of different heights after a rainstorm. You want to find out how much water is trapped between these walls. Doing this by looking at each wall and guessing the water trapped is like trying to count drops of water in a messy puddle by hand.
Manually checking each wall and calculating trapped water is slow and confusing. You might miss some spots or count water twice. It's easy to make mistakes because you have to look left and right for every wall to find the boundaries that hold water.
Using a stack helps keep track of walls that can trap water. The stack remembers walls that might hold water until a taller wall comes along. This way, you only check walls once, making the calculation fast and accurate without guessing.
int totalWater = 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]); totalWater += Math.Min(leftMax, rightMax) - heights[i]; }
Stack<int> stack = new Stack<int>(); int totalWater = 0, current = 0; while (current < heights.Length) { while (stack.Count > 0 && heights[current] > heights[stack.Peek()]) { int top = stack.Pop(); if (stack.Count == 0) break; int distance = current - stack.Peek() - 1; int boundedHeight = Math.Min(heights[current], heights[stack.Peek()]) - heights[top]; totalWater += distance * boundedHeight; } stack.Push(current++); }
This method lets you quickly and correctly find how much water is trapped between walls of different heights, even in complex shapes.
City planners use this idea to understand how water collects between buildings after rain, helping design better drainage systems to prevent flooding.
Manual checking is slow and error-prone.
Stack keeps track of walls to calculate trapped water efficiently.
Enables fast, accurate water trapping calculation in one pass.
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 for a right boundary to trap water.Step 2: Explain why other options are incorrect
The stack does not store water amount, sort, or reverse the array; it helps find boundaries.Final Answer:
To keep track of bars that are not yet processed for water trapping -> Option AQuick Check:
Stack tracks bars for trapping water = A [OK]
- Thinking stack stores water amount directly
- Assuming stack sorts or reverses the array
- Confusing stack with a queue
Solution
Step 1: Identify correct stack declaration
Stack<int> stack = new Stack<int>(); uses generic Stack<int> which is type-safe and correct for storing indices.Step 2: Explain why others are incorrect
Stack stack = new Stack(); is non-generic and less type-safe; C uses List, not stack; D uses Queue, wrong data structure.Final Answer:
Stack<int> stack = new Stack<int>(); -> Option BQuick Check:
Generic Stack<int> is correct stack declaration [OK]
- Using non-generic Stack without type safety
- Using List instead of Stack
- Confusing Queue with Stack
int[] height = {0,1,0,2,1,0,1,3,2,1,2,1};
int water = 0;
Stack<int> stack = new Stack<int>();
for (int i = 0; i < height.Length; i++) {
while (stack.Count > 0 && height[i] > height[stack.Peek()]) {
int top = stack.Pop();
if (stack.Count == 0) break;
int distance = i - stack.Peek() - 1;
int boundedHeight = Math.Min(height[i], height[stack.Peek()]) - height[top];
water += distance * boundedHeight;
}
stack.Push(i);
}
Console.WriteLine(water);Solution
Step 1: Trace the stack operations and water calculation
The code calculates trapped water for the given height array using stack logic. The total trapped water is 6 units.Step 2: Confirm calculation matches known example
This is a classic example where trapped water is known to be 6 units for the given heights.Final Answer:
6 -> Option DQuick Check:
Trapped water for given heights = 6 [OK]
- Miscounting distance or bounded height
- Forgetting to check stack empty before popping
- Mixing up indices and heights
int[] height = {4,2,0,3,2,5};
int water = 0;
Stack<int> stack = new Stack<int>();
for (int i = 0; i < height.Length; i++) {
while (stack.Count > 0 && height[i] >= height[stack.Peek()]) {
int top = stack.Pop();
if (stack.Count == 0) break;
int distance = i - stack.Peek() - 1;
int boundedHeight = Math.Min(height[i], height[stack.Peek()]) - height[top];
water += distance * boundedHeight;
}
stack.Push(i);
}
Console.WriteLine(water);Solution
Step 1: Analyze the while loop condition
The condition uses >= which causes incorrect popping when heights are equal, leading to wrong water calculation.Step 2: Correct condition and explain impact
Changing >= to > fixes the logic by only popping when current height is strictly greater, preserving correct boundaries.Final Answer:
The comparison should be > instead of >= in the while condition -> Option CQuick Check:
Use > not >= in while condition [OK]
- Using >= causes extra pops and wrong water
- Confusing stack with queue
- Incorrect distance or boundedHeight formulas
int[] height = {5,2,1,2,1,5};, what is the total trapped rain water calculated using the stack-based algorithm?Solution
Step 1: Visualize trapped water between bars
Between the two 5-height bars at ends, water is trapped over lower bars: (5-2)+(5-1)+(5-2)+(5-1) = 3+4+3+4 but we must count carefully by positions.Step 2: Calculate trapped water using stack logic
Trapped water units are 3 (between 5 and 2), 1 (between 2 and 1), 3 (between 2 and 1), and 5 (between 1 and 5), total 12 units.Final Answer:
12 -> Option AQuick Check:
Trapped water total = 12 units [OK]
- Adding heights instead of differences
- Ignoring boundaries at array ends
- Miscounting trapped water units
Ready to prove it?
Pass the test and this pattern moves unknown
