Discover how a simple stack can solve a tricky water trapping puzzle in seconds!
Why Trapping Rain Water Using Stack in DSA Go?
Imagine you have a row of buildings with different heights, and after it rains, water collects between them. If you try to calculate how much water is trapped by checking each gap manually, it becomes very confusing and slow.
Manually checking each space between buildings to find trapped water means looking back and forth repeatedly. This is slow and easy to make mistakes, especially when buildings have varying heights and many gaps.
Using a stack helps keep track of building heights in a smart way. It lets you quickly find where water can be trapped by remembering the last building that could hold water, making the calculation fast and simple.
totalWater := 0 for i := 1; i < len(heights)-1; i++ { leftMax := max(heights[:i]) rightMax := max(heights[i+1:]) water := min(leftMax, rightMax) - heights[i] if water > 0 { totalWater += water } }
stack := []int{}
totalWater := 0
for current := 0; current < len(heights); current++ {
for len(stack) > 0 && heights[current] > heights[stack[len(stack)-1]] {
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if len(stack) == 0 {
break
}
distance := current - stack[len(stack)-1] - 1
boundedHeight := min(heights[current], heights[stack[len(stack)-1]]) - heights[top]
if boundedHeight > 0 {
totalWater += distance * boundedHeight
}
}
stack = append(stack, current)
}This method allows you to quickly and accurately calculate trapped rainwater even in complex building height patterns.
City planners can use this to estimate how much water will collect between buildings after rain, helping design better drainage systems.
Manual checking is slow and error-prone for trapping rainwater.
Stack helps track building heights to find trapped water efficiently.
Using stack reduces time and makes calculations easier and faster.
Practice
Trapping Rain Water Using Stack algorithm?Solution
Step 1: Understand the role of stack
The stack stores indices of bars, not heights, to help find boundaries for trapped water.Step 2: Use indices to calculate trapped water
By using indices, we can calculate width and height of trapped water between bars.Final Answer:
To keep track of the indices of bars to calculate trapped water -> Option AQuick Check:
Stack stores indices, not heights [OK]
- Thinking stack stores heights instead of indices
- Assuming stack sorts bars
- Using stack to reverse array
Solution
Step 1: Identify correct stack type
Stack should be a slice of integers to store indices, sovar stack []intis correct.Step 2: Check other options
stack := make(map[int]int) uses a map, not a stack. stack := []string{} uses string slice, wrong type. var stack int is a single int, not a stack.Final Answer:
var stack []int -> Option CQuick Check:
Stack as int slice = var stack []int [OK]
- Using map instead of slice for stack
- Using wrong data type like string
- Declaring stack as single int variable
heights := []int{0,1,0,2,1,0,1,3,2,1,2,1}
stack := []int{}
water := 0
for i := 0; i < len(heights); i++ {
for len(stack) > 0 && heights[i] >= heights[stack[len(stack)-1]] {
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if len(stack) == 0 {
break
}
distance := i - stack[len(stack)-1] - 1
boundedHeight := min(heights[i], heights[stack[len(stack)-1]]) - heights[top]
water += distance * boundedHeight
}
stack = append(stack, i)
}
fmt.Println(water)
func min(a, b int) int {
if a < b {
return a
}
return b
}Solution
Step 1: Trace the stack and water calculation
The code implements the standard stack-based trapping rain water algorithm on the given heights array.Step 2: Calculate trapped water for given input
For input {0,1,0,2,1,0,1,3,2,1,2,1}, trapped water is 6 units.Final Answer:
6 -> Option DQuick Check:
Standard example input yields 6 units trapped water [OK]
- Miscounting trapped water units
- Ignoring stack empty check
- Wrong min height calculation
heights := []int{4,2,0,3,2,5}
stack := []int{}
water := 0
for i := 0; i < len(heights); i++ {
for len(stack) > 0 && heights[i] > heights[stack[len(stack)-1]] {
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
if len(stack) == 0 {
break
}
distance := i - stack[len(stack)-1] - 1
boundedHeight := min(heights[i], heights[stack[len(stack)-1]]) - heights[top]
water += distance * boundedHeight
}
stack = append(stack, i)
}
fmt.Println(water)
func min(a, b int) int {
if a < b {
return a
}
return b
}
What is the bug?Solution
Step 1: Analyze inner loop condition
The condition uses '>' but it should be '>=' to correctly handle equal height bars.Step 2: Effect of wrong condition
Using '>' skips popping when heights are equal, causing incorrect trapped water calculation.Final Answer:
Using '>' instead of '>=' in the inner loop condition -> Option AQuick Check:
Use '>=' to handle equal heights correctly [OK]
- Using '>' instead of '>=' causing missed pops
- Not checking stack empty before pop (though code does)
- Miscomputing distance or bounded height
[]int{3, 0, 2, 0, 4}, how much water will be trapped using the stack-based algorithm? Also, explain why the stack helps in this case.Solution
Step 1: Calculate trapped water manually
Water at pos1: 3 units, pos2: 1 unit, pos3: 3 units. Total trapped water = 7 units.Step 2: Explain stack role
The stack stores indices of bars to find left and right boundaries for water trapping, allowing calculation of width and height of trapped water efficiently.Final Answer:
7 units -> Option BQuick Check:
Stack trace or min(leftmax,rightmax)-h sum = 7 units [OK]
- Miscounting trapped water between bars
- Not understanding stack helps find boundaries
- Ignoring zero height bars in calculation
Ready to prove it?
Pass the test and this pattern moves unknown
