Bird
Raised Fist0
DSA Pythonprogramming~5 mins

Trapping Rain Water Problem in DSA Python - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Trapping Rain Water Problem
O(n)
Understanding Time Complexity

We want to understand how the time taken to solve the Trapping Rain Water problem changes as the input size grows.

Specifically, how the number of operations depends on the number of bars in the elevation map.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


def trap(height):
    n = len(height)
    left, right = 0, n - 1
    left_max, right_max = 0, 0
    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
    return water
    

This code calculates how much water can be trapped between bars represented by the list height.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The while loop that moves two pointers across the array.
  • How many times: Each element is visited at most once by either the left or right pointer, so total visits are proportional to the array length.
How Execution Grows With Input

As the number of bars increases, the loop runs once per bar, so operations grow linearly.

Input Size (n)Approx. Operations
10About 10 steps
100About 100 steps
1000About 1000 steps

Pattern observation: Doubling the input size roughly doubles the number of operations.

Final Time Complexity

Time Complexity: O(n)

This means the time to compute trapped water grows directly in proportion to the number of bars.

Common Mistake

[X] Wrong: "Because there are nested if-else statements, the time complexity must be quadratic O(n²)."

[OK] Correct: The if-else statements are inside a single loop that moves pointers only once through the array, so the total steps are still linear, not multiplied.

Interview Connect

Understanding this linear time solution shows you can optimize problems by clever pointer use instead of brute force, a skill highly valued in interviews.

Self-Check

"What if we used two nested loops to check water trapped at each bar? How would the time complexity change?"

Practice

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

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 trapped water volume between bars, not just the tallest bar or sum of heights.
  3. Final Answer:

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

    Trapped water = total water held between bars [OK]
Hint: Focus on trapped water volume, not bar heights [OK]
Common Mistakes:
  • Confusing trapped water with tallest bar height
  • Summing bar heights instead of water trapped
  • Ignoring spaces between bars where water collects
2. Which of the following Python code snippets correctly initializes two pointers for the two-pointer approach in the Trapping Rain Water problem?
easy
A. left, right = 0, len(height) - 1
B. left, right = 1, len(height)
C. left, right = 0, len(height)
D. left, right = -1, len(height) - 1

Solution

  1. Step 1: Understand pointer initialization

    Two pointers start at the ends: left at 0, right at last index (length - 1).
  2. Step 2: Check each option

    left, right = 0, len(height) - 1 correctly sets left=0 and right=len(height)-1. Others have invalid indices.
  3. Final Answer:

    left, right = 0, len(height) - 1 -> Option A
  4. Quick Check:

    Start pointers at array ends [OK]
Hint: Two pointers start at first and last index [OK]
Common Mistakes:
  • Setting right pointer to len(height) (out of range)
  • Starting left pointer at 1 instead of 0
  • Using negative indices incorrectly
3. What is the output of the following Python code for trapping rain water?
def trap(height):
    left, right = 0, len(height) - 1
    left_max = right_max = 0
    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
    return water

print(trap([0,1,0,2,1,0,1,3,2,1,2,1]))
medium
A. 5
B. 6
C. 4
D. 7

Solution

  1. Step 1: Trace pointers and water accumulation

    Using two pointers, water trapped is calculated by comparing left and right heights and updating max heights.
  2. Step 2: Calculate trapped water for given input

    For input [0,1,0,2,1,0,1,3,2,1,2,1], total trapped water is 6 units.
  3. Final Answer:

    6 -> Option B
  4. Quick Check:

    Standard example result = 6 [OK]
Hint: Use two-pointer method to sum trapped water [OK]
Common Mistakes:
  • Miscounting trapped water units
  • Not updating max heights correctly
  • Confusing left and right pointer moves
4. Find the error in this Python code snippet for the Trapping Rain Water problem:
def trap(height):
    left, right = 0, len(height) - 1
    left_max = right_max = 0
    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
    return water
medium
A. The while loop condition should be 'left < right' instead of 'left <= right'
B. The comparison operators '>' should be '>=' when updating max heights
C. The water accumulation formula is incorrect
D. The pointers should be initialized to 1 and len(height) - 2

Solution

  1. Step 1: Analyze the loop condition

    The loop uses 'left <= right', which causes pointers to cross and double count or error.
  2. Step 2: Correct loop condition

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

    The while loop condition should be 'left < right' instead of 'left <= right' -> Option A
  4. Quick Check:

    Loop ends before pointers cross [OK]
Hint: Use strict less than in loop to avoid pointer overlap [OK]
Common Mistakes:
  • Using <= causes double counting
  • Not updating max heights correctly
  • Incorrect pointer initialization
5. Given the height array [4,2,0,3,2,5], what is the total trapped rain water? Use the two-pointer approach to solve.
hard
A. 7
B. 8
C. 6
D. 9

Solution

  1. Step 1: Initialize pointers and max heights

    left=0, right=5, left_max=0, right_max=0, water=0.
  2. Step 2: Move pointers and calculate trapped water

    Walk through: - left=0 (4), right=5 (5), left < right - height[left]
  3. Final Answer:

    9 -> Option D
  4. Quick Check:

    Sum trapped water units = 9 [OK]
Hint: Add water trapped at each step using max heights [OK]
Common Mistakes:
  • Miscounting trapped water at zero height bars
  • Not updating left_max and right_max correctly
  • Stopping loop too early or late
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