Trapping Rain Water
Problem Statement
Given an array of heights representing bars, compute how much water can be trapped between them after raining. This is a hard-level problem solved using two pointers.
Example
Input: height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
Output: 6 (water trapped in various dips sums to 6 units)
Code
Java
Python
JavaScript
public class Solution { public int trap(int[] height) { int left = 0, right = height.length - 1; int leftMax = 0, rightMax = 0; int water = 0; while (left < right) { leftMax = Math.max(leftMax, height[left]); rightMax = Math.max(rightMax, height[right]); if (leftMax < rightMax) { water += leftMax - height[left]; left++; } else { water += rightMax - height[right]; right--; } } return water; } }
def trap(height): left, right = 0, len(height) - 1 left_max, right_max = 0, 0 water = 0 while left < right: left_max = max(left_max, height[left]) right_max = max(right_max, height[right]) if left_max < right_max: water += left_max - height[left] left += 1 else: water += right_max - height[right] right -= 1 return water # Example usage print(trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])) # 6
function trap(height) { let left = 0, right = height.length - 1; let leftMax = 0, rightMax = 0; let water = 0; while (left < right) { leftMax = Math.max(leftMax, height[left]); rightMax = Math.max(rightMax, height[right]); if (leftMax < rightMax) { water += leftMax - height[left]; left++; } else { water += rightMax - height[right]; right--; } } return water; } // Example usage console.log(trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])); // 6
Explanation
- Use two pointers: left and right, with variables to track maximum heights seen.
- Water trapped at a position is the minimum of leftMax and rightMax minus the height there.
- Move the pointer with the smaller max height, adding trapped water each step.
- Continue until pointers meet, summing all trapped water.
Note
Time complexity is O(n) with a single pass. Space complexity is O(1) as it uses constant extra space.