--- title: '42. Trapping Rain Water' description: Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining icon: dot topics: - { name: "Array", slug: "array" } - { name: "Two Pointers", slug: "two-pointers" } - { name: "Dynamic Programming", slug: "dynamic-programming" } - { name: "Stack", slug: "stack" } - { name: "Monotonic Stack", slug: "monotonic-stack" } issue: "https://github.com/prdlk/leetcode/issues/211" companies: - { name: "Ola Cabs", period: "Thirty Days", frequency: 90.7 } - { name: "Amazon", period: "Thirty Days", frequency: 80.7 } - { name: "Goldman Sachs", period: "Thirty Days", frequency: 71.7 } - { name: "Bloomberg", period: "Thirty Days", frequency: 69.8 } - { name: "Infosys", period: "Thirty Days", frequency: 68.6 } - { name: "Google", period: "Thirty Days", frequency: 63.7 } - { name: "Snowflake", period: "Three Months", frequency: 90.3 } - { name: "Meta", period: "Three Months", frequency: 58.9 } - { name: "Microsoft", period: "Three Months", frequency: 57.2 } - { name: "tcs", period: "Three Months", frequency: 47.7 } - { name: "Docusign", period: "Six Months", frequency: 100 } - { name: "Qualcomm", period: "Six Months", frequency: 80.7 } - { name: "Nvidia", period: "Six Months", frequency: 78.7 } sidebar: label: 'Trapping Rain Water' badge: 'Hard' --- ### Example 1: - Input: `height = [0,1,0,2,1,0,1,3,2,1,2,1]` - Output: `6` - Explanation: The above elevation map (black section) is represented by array `[0,1,0,2,1,0,1,3,2,1,2,1]`. In this case, `6` units of rain water (blue section) are being trapped. ### Example 2: - Input: `height = [4,2,0,3,2,5]` - Output: `9` ### Constraints: - `n == height.length` - `1 <= n <= 2 * 10^4` - `0 <= height[i] <= 10^5` ## Solution ```py class Solution: def trap(self, height: list[int]) -> int: left, right = 0, len(height) - 1 leftMax, rightMax = 0, 0 total = 0 while left < right: leftMax = max(leftMax, height[left]) rightMax = max(rightMax, height[right]) if height[left] < height[right]: total += leftMax - height[left] left += 1 else: total += rightMax - height[right] right -= 1 return total ```