Bird
Raised Fist0
DSA Rustprogramming~20 mins

Trapping Rain Water Problem in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Trapping Rain Water Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of trapping rain water calculation
What is the output of the following Rust code that calculates trapped rain water for the given height array?
DSA Rust
fn trap(height: Vec<i32>) -> i32 {
    let n = height.len();
    let mut left_max = vec![0; n];
    let mut right_max = vec![0; n];
    let mut water = 0;

    if n == 0 {
        return 0;
    }

    left_max[0] = height[0];
    for i in 1..n {
        left_max[i] = left_max[i - 1].max(height[i]);
    }

    right_max[n - 1] = height[n - 1];
    for i in (0..n - 1).rev() {
        right_max[i] = right_max[i + 1].max(height[i]);
    }

    for i in 0..n {
        water += left_max[i].min(right_max[i]) - height[i];
    }

    water
}

fn main() {
    let height = vec![0,1,0,2,1,0,1,3,2,1,2,1];
    println!("{}", trap(height));
}
A6
B5
C7
D8
Attempts:
2 left
💡 Hint
Think about how the left_max and right_max arrays help find trapped water at each position.
🧠 Conceptual
intermediate
1:30remaining
Understanding the role of left_max and right_max arrays
In the trapping rain water problem, what do the left_max and right_max arrays represent?
Aleft_max[i] is the lowest bar from the start to i; right_max[i] is the lowest bar from i to the end
Bleft_max[i] is the highest bar from the start to i; right_max[i] is the highest bar from i to the end
Cleft_max[i] and right_max[i] store the water trapped at position i
Dleft_max[i] and right_max[i] store the height of the bar at position i
Attempts:
2 left
💡 Hint
Think about how to find the boundaries that trap water at each position.
🔧 Debug
advanced
2:00remaining
Identify the error in this Rust code for trapping rain water
What error will this Rust code produce when run?
DSA Rust
fn trap(height: Vec<i32>) -> i32 {
    let n = height.len();
    let mut left_max = vec![0; n];
    let mut right_max = vec![0; n];
    let mut water = 0;

    if n == 0 {
        return 0;
    }

    left_max[0] = height[0];
    for i in 1..n {
        left_max[i] = left_max[i - 1].max(height[i]);
    }

    right_max[n - 1] = height[n - 1];
    for i in (0..n - 1).rev() {
        right_max[i] = right_max[i + 1].max(height[i]);
    }

    for i in 0..n {
        water += left_max[i].min(right_max[i]) - height[i];
    }

    water
}

fn main() {
    let height = vec![4,2,0,3,2,5];
    println!("{}", trap(height));
}
ANo error, outputs 9
BCompilation error due to missing semicolon
CLogic error causing incorrect trapped water calculation
DIndex out of bounds panic at line right_max[n] = height[n - 1];
Attempts:
2 left
💡 Hint
Check array indexing carefully, especially at boundaries.
🚀 Application
advanced
1:30remaining
Calculate trapped water for a custom height array
Given the height array [3, 0, 2, 0, 4], what is the total trapped rain water?
A7
B6
C5
D4
Attempts:
2 left
💡 Hint
Visualize the bars and the water trapped between them.
🧠 Conceptual
expert
1:00remaining
Time complexity of the trapping rain water algorithm using left_max and right_max arrays
What is the time complexity of the trapping rain water solution that uses left_max and right_max arrays?
AO(log n) because it uses binary search to find boundaries
BO(n^2) because it uses nested loops to calculate trapped water
CO(n) because it traverses the height array a fixed number of times
DO(1) because it uses constant extra space
Attempts:
2 left
💡 Hint
Consider how many times the array is traversed.

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