Bird
Raised Fist0
DSA Goprogramming~3 mins

Why Trapping Rain Water Problem in DSA Go?

Choose your learning style10 modes available
The Big Idea

What if you could instantly know how much rainwater your roof traps without climbing up to check?

The Scenario

Imagine you have a row of uneven walls after a rainstorm, and you want to know how much water is trapped between them. Counting the water manually by looking at each gap is confusing and takes a lot of time.

The Problem

Manually checking each gap between walls is slow and easy to make mistakes. You might forget to consider the height of walls on both sides or miss small pockets of water. This leads to wrong answers and frustration.

The Solution

The Trapping Rain Water Problem uses a smart way to look at the walls from both ends and calculate trapped water efficiently. It avoids repeated checks and quickly finds the total water trapped without errors.

Before vs After
✗ Before
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
  }
}
✓ After
left, right := 0, len(heights)-1
leftMax, rightMax := 0, 0
totalWater := 0
for left < right {
  if heights[left] < heights[right] {
    if heights[left] >= leftMax {
      leftMax = heights[left]
    } else {
      totalWater += leftMax - heights[left]
    }
    left++
  } else {
    if heights[right] >= rightMax {
      rightMax = heights[right]
    } else {
      totalWater += rightMax - heights[right]
    }
    right--
  }
}
What It Enables

This problem's solution lets you quickly find how much water can be trapped in any shape of walls, helping in real-world tasks like flood simulation and design.

Real Life Example

City planners use this concept to understand how rainwater collects between buildings and design better drainage systems to prevent flooding.

Key Takeaways

Manual counting of trapped water is slow and error-prone.

Two-pointer approach efficiently calculates trapped water in one pass.

Useful for real-world water flow and storage problems.

Practice

(1/5)
1. What does the Trapping Rain Water problem ask you to find given an array of heights?
easy
A. The minimum height of the bars
B. The maximum height of the bars
C. The total amount of water that can be trapped between the bars after raining
D. The number of bars in the array

Solution

  1. Step 1: Understand the problem context

    The problem gives an array representing heights of bars and asks how much water can be trapped between them after rain.
  2. Step 2: Identify the goal

    The goal is to calculate the total volume of trapped water, not just heights or counts.
  3. Final Answer:

    The total amount of water trapped between bars -> Option C
  4. Quick Check:

    Trapping Rain Water = Total trapped water [OK]
Hint: Think of bars as walls holding water in gaps [OK]
Common Mistakes:
  • Confusing trapped water with bar heights
  • Counting bars instead of water volume
  • Ignoring gaps between bars
2. Which of the following Go code snippets correctly initializes an integer slice to represent bar heights for the Trapping Rain Water problem?
easy
A. heights := new int[6]{4, 2, 0, 3, 2, 5}
B. heights := int[]{4, 2, 0, 3, 2, 5}
C. heights := [6]int{4, 2, 0, 3, 2, 5}
D. heights := []int{4, 2, 0, 3, 2, 5}

Solution

  1. Step 1: Recall Go slice initialization syntax

    In Go, slices are initialized with []int{values}, arrays with [size]int{values}.
  2. Step 2: Identify correct slice syntax

    heights := []int{4, 2, 0, 3, 2, 5} uses []int{...} which is correct for a slice. heights := [6]int{4, 2, 0, 3, 2, 5} is an array, also valid but less flexible.
  3. Final Answer:

    heights := []int{4, 2, 0, 3, 2, 5} -> Option D
  4. Quick Check:

    Slice syntax = []int{...} [OK]
Hint: Use []int{} for slices, [n]int{} for arrays [OK]
Common Mistakes:
  • Using int[] like in other languages
  • Trying to use new keyword for slices
  • Confusing arrays and slices syntax
3. What is the output of the following Go code snippet that calculates trapped rain water?
package main
import "fmt"
func trap(height []int) int {
    left, right := 0, len(height)-1
    leftMax, rightMax := 0, 0
    water := 0
    for left < right {
        if height[left] < height[right] {
            if height[left] >= leftMax {
                leftMax = height[left]
            } else {
                water += leftMax - height[left]
            }
            left++
        } else {
            if height[right] >= rightMax {
                rightMax = height[right]
            } else {
                water += rightMax - height[right]
            }
            right--
        }
    }
    return water
}
func main() {
    fmt.Println(trap([]int{0,1,0,2,1,0,1,3,2,1,2,1}))
}
medium
A. 6
B. 5
C. 7
D. 8

Solution

  1. Step 1: Understand two-pointer approach

    The code uses two pointers moving inward, tracking max heights on left and right to calculate trapped water.
  2. Step 2: Trace the example input

    For input [0,1,0,2,1,0,1,3,2,1,2,1], the trapped water calculated by this method is 6 units.
  3. Final Answer:

    6 -> Option A
  4. Quick Check:

    Two-pointer trap water = 6 [OK]
Hint: Use two pointers and track max heights from both ends [OK]
Common Mistakes:
  • Not updating max heights correctly
  • Adding negative water amounts
  • Confusing left and right pointer moves
4. Identify the bug in the following Go code for trapping rain water and select the correct fix:
func trap(height []int) int {
    left, right := 0, len(height)-1
    leftMax, rightMax := 0, 0
    water := 0
    for left <= right {
        if height[left] < height[right] {
            if height[left] > leftMax {
                leftMax = height[left]
            } else {
                water += leftMax - height[left]
            }
            left++
        } else {
            if height[right] > rightMax {
                rightMax = height[right]
            } else {
                water += rightMax - height[right]
            }
            right--
        }
    }
    return water
}
medium
A. Change '>' to '>=' in max height comparisons
B. Change loop condition to 'left < right' instead of 'left <= right'
C. Initialize water to 1 instead of 0
D. Swap left and right pointer initial values

Solution

  1. Step 1: Analyze loop condition impact

    The loop uses 'left <= right', which causes double counting when left == right.
  2. Step 2: Fix loop condition

    Changing to 'left < right' prevents overlap and corrects water calculation.
  3. Final Answer:

    Change loop condition to 'left < right' instead of 'left <= right' -> Option B
  4. Quick Check:

    Loop condition fix = 'left < right' [OK]
Hint: Use strict less than in two-pointer loops to avoid overlap [OK]
Common Mistakes:
  • Using <= causes double counting
  • Changing comparison operators incorrectly
  • Incorrect pointer initialization
5. Given the heights array [5, 2, 1, 2, 1, 5], what is the total trapped rain water? Use the two-pointer approach to solve.
hard
A. 10
B. 12
C. 8
D. 14

Solution

  1. Step 1: Initialize pointers and max heights

    left=0, right=5, leftMax=0, rightMax=0, water=0.
  2. Step 2: Move pointers inward calculating trapped water

    - left=0 (height=5) >= leftMax(0), leftMax=5, left++ - left=1 (2) < right=5 (5), height[left]
  3. Final Answer:

    10 -> Option A
  4. Quick Check:

    Two-pointer sum water = 10 [OK]
Hint: Sum min(leftMax, rightMax) - height at each step [OK]
Common Mistakes:
  • Adding water twice for same positions
  • Not updating max heights correctly
  • Stopping loop too early
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard