Bird
Raised Fist0
DSA Rustprogramming~3 mins

Why Trapping Rain Water Problem in DSA Rust?

Choose your learning style10 modes available
The Big Idea

What if you could instantly know how much rainwater a city's buildings trap without guessing?

The Scenario

Imagine you have a row of different height walls 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 in a puddle by eye.

The Problem

Manually calculating trapped water is slow and error-prone because you must consider the highest walls on both sides for every position. It's easy to miss spots or double count, especially when walls vary a lot in height.

The Solution

The Trapping Rain Water algorithm quickly calculates trapped water by using two pointers or arrays to track the highest walls from left and right. This way, it finds trapped water at each position without guessing, making the process fast and accurate.

Before vs After
✗ Before
let mut total_water = 0;
for i in 1..heights.len()-1 {
    let left_max = heights[..=i].iter().max().unwrap();
    let right_max = heights[i..].iter().max().unwrap();
    let water = (*left_max).min(*right_max) - heights[i];
    if water > 0 {
        total_water += water;
    }
}
✓ After
let mut left = 0;
let mut right = heights.len() - 1;
let mut left_max = 0;
let mut right_max = 0;
let mut total_water = 0;
while left < right {
    if heights[left] < heights[right] {
        if heights[left] >= left_max {
            left_max = heights[left];
        } else {
            total_water += left_max - heights[left];
        }
        left += 1;
    } else {
        if heights[right] >= right_max {
            right_max = heights[right];
        } else {
            total_water += right_max - heights[right];
        }
        right -= 1;
    }
}
What It Enables

This algorithm enables fast and precise calculation of trapped water, even for very large and complex wall height arrays.

Real Life Example

City planners use this concept to estimate how much rainwater can be collected or trapped in urban areas with buildings of different heights, helping design better drainage systems.

Key Takeaways

Manual counting is slow and error-prone for varying wall heights.

The algorithm uses two pointers to track max heights efficiently.

It calculates trapped water quickly and accurately for each position.

Practice

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

Solution

  1. Step 1: Understand the problem context

    The problem involves an array representing heights of bars where water can be trapped between them.
  2. Step 2: Identify what is asked

    We need to find how much water can be trapped after raining, which depends on the heights and gaps between bars.
  3. Final Answer:

    The total amount of water that can be trapped between the bars after raining -> Option A
  4. Quick Check:

    Trapping Rain Water = Total trapped water [OK]
Hint: Think of bars as walls holding water in between [OK]
Common Mistakes:
  • Confusing trapped water with total height sum
  • Ignoring gaps between bars
  • Only finding tallest bar instead of trapped water
2. Which Rust code snippet correctly initializes a vector of bar heights for the Trapping Rain Water problem?
easy
A. let heights = [0,1,0,2,1,0,1,3,2,1,2,1];
B. let heights = vec![0,1,0,2,1,0,1,3,2,1,2,1];
C. let heights = (0,1,0,2,1,0,1,3,2,1,2,1);
D. let heights = {0,1,0,2,1,0,1,3,2,1,2,1};

Solution

  1. Step 1: Identify Rust vector syntax

    In Rust, vectors are created using vec![elements], which is dynamic and growable.
  2. Step 2: Check each option

    let heights = vec![0,1,0,2,1,0,1,3,2,1,2,1]; uses vec! macro correctly; B is an array, C is a tuple, D is invalid syntax.
  3. Final Answer:

    let heights = vec![0,1,0,2,1,0,1,3,2,1,2,1]; -> Option B
  4. Quick Check:

    vec! macro creates vector [OK]
Hint: Use vec![] to create vectors in Rust [OK]
Common Mistakes:
  • Using array syntax instead of vector
  • Using tuple parentheses instead of brackets
  • Using curly braces which are invalid here
3. What is the output of this Rust code snippet that calculates trapped water?
fn trap(height: Vec<i32>) -> i32 {
    let mut left = 0;
    let mut right = height.len() - 1;
    let mut left_max = 0;
    let mut right_max = 0;
    let mut water = 0;
    while left < right {
        if height[left] < height[right] {
            if height[left] > left_max {
                left_max = height[left];
            } else {
                water += left_max - height[left];
            }
            left += 1;
        } else {
            if height[right] > right_max {
                right_max = height[right];
            } else {
                water += right_max - height[right];
            }
            right -= 1;
        }
    }
    water
}

fn main() {
    let heights = vec![0,1,0,2,1,0,1,3,2,1,2,1];
    println!("{}", trap(heights));
}
medium
A. 6
B. 5
C. 4
D. 7

Solution

  1. Step 1: Understand two-pointer approach in code

    The code uses two pointers from left and right, tracking max heights and accumulating 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 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:
  • Miscounting trapped water units
  • Confusing left_max and right_max updates
  • Off-by-one errors in pointer movement
4. Identify the bug in this Rust function for trapping rain water:
fn trap(height: Vec<i32>) -> i32 {
    let mut left = 0;
    let mut right = height.len();
    let mut left_max = 0;
    let mut right_max = 0;
    let mut water = 0;
    while left < right {
        if height[left] < height[right] {
            if height[left] > left_max {
                left_max = height[left];
            } else {
                water += left_max - height[left];
            }
            left += 1;
        } else {
            if height[right] > right_max {
                right_max = height[right];
            } else {
                water += right_max - height[right];
            }
            right -= 1;
        }
    }
    water
}
medium
A. water should be a float instead of i32
B. left_max and right_max should start at 1
C. The while loop condition should be left <= right
D. right should be initialized to height.len() - 1

Solution

  1. Step 1: Check initialization of right pointer

    right is set to height.len(), which is out of bounds for indexing (max index is len()-1).
  2. Step 2: Correct right initialization

    right should be height.len() - 1 to point to the last valid index.
  3. Final Answer:

    right should be initialized to height.len() - 1 -> Option D
  4. Quick Check:

    Indexing error fixed by right = len()-1 [OK]
Hint: Array indices go from 0 to len-1, not len [OK]
Common Mistakes:
  • Using len() as index causes runtime panic
  • Changing loop condition incorrectly
  • Starting max heights at wrong values
5. Given the heights array [4,2,0,3,2,5], what is the total trapped rain water using the two-pointer approach?
hard
A. 6
B. 7
C. 9
D. 8

Solution

  1. Step 1: Analyze heights and max boundaries

    Left max starts at 4, right max at 5. Water trapped depends on min(left_max, right_max) minus current height.
  2. Step 2: Calculate trapped water step-by-step

    Positions: - index 1: min(4,5)=4, height=2, trapped=2 - index 2: min(4,5)=4, height=0, trapped=4 - index 3: min(4,5)=4, height=3, trapped=1 - index 4: min(4,5)=4, height=2, trapped=2 Total trapped water = 2+4+1+2 = 9 units. Verified with two-pointer simulation.
  3. Final Answer:

    9 -> Option C
  4. Quick Check:

    Two-pointer trap water for [4,2,0,3,2,5] = 9 [OK]
Hint: Calculate trapped water by min(left_max, right_max) - height [OK]
Common Mistakes:
  • Adding trapped water incorrectly at edges
  • Confusing left_max and right_max updates
  • Forgetting to move pointers properly
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