Bird
Raised Fist0
DSA Rustprogramming~30 mins

Trapping Rain Water Problem in DSA Rust - Build from Scratch

Choose your learning style10 modes available
Trapping Rain Water Problem
📖 Scenario: Imagine you have a row of walls of different heights. When it rains, water gets trapped between these walls. You want to find out how much water is trapped after the rain stops.
🎯 Goal: Build a Rust program that calculates the total amount of trapped rain water given a list of wall heights.
📋 What You'll Learn
Create a vector called heights with the exact values [0,1,0,2,1,0,1,3,2,1,2,1]
Create two vectors called left_max and right_max to store the maximum wall heights from the left and right sides
Calculate the trapped water at each position using the minimum of left_max and right_max minus the current height
Print the total trapped water as an integer
💡 Why This Matters
🌍 Real World
Calculating trapped rain water helps in designing drainage systems and understanding water flow in terrains.
💼 Career
This problem is a common interview question to test problem-solving and array manipulation skills.
Progress0 / 4 steps
1
Create the wall heights vector
Create a vector called heights with the exact values [0,1,0,2,1,0,1,3,2,1,2,1].
DSA Rust
Hint

Use let heights = vec![0,1,0,2,1,0,1,3,2,1,2,1]; to create the vector.

2
Create left_max and right_max vectors
Create two vectors called left_max and right_max of the same length as heights. Initialize left_max[0] with heights[0] and fill left_max so each element is the maximum height to the left including itself. Initialize right_max similarly from the right side, with right_max[last] equal to heights[last].
DSA Rust
Hint

Use loops to fill left_max and right_max by comparing previous max values with current heights.

3
Calculate total trapped water
Create a variable called total_water and set it to 0. Use a for loop with variable i from 0 to n (exclusive). For each i, add to total_water the value of the minimum of left_max[i] and right_max[i] minus heights[i].
DSA Rust
Hint

Use a loop to add trapped water at each position by subtracting the height from the minimum of left_max and right_max.

4
Print the total trapped water
Print the value of total_water using println!.
DSA Rust
Hint

Use println!("{}", total_water); to display the result.

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