from typing import List
class Solution:
def trap(self, height: List[int]) -> int:
n = len(height)
if n == 0:
return 0
left_max = [0] * n
right_max = [0] * n
left_max[0] = height[0]
for i in range(1, n):
left_max[i] = max(left_max[i - 1], height[i]) # track tallest bar from left
right_max[n - 1] = height[n - 1]
for i in range(n - 2, -1, -1):
right_max[i] = max(right_max[i + 1], height[i]) # track tallest bar from right
trapped_water = 0
for i in range(n):
water_level = min(left_max[i], right_max[i])
trapped_water += water_level - height[i] # water trapped on current bar
return trapped_water
# Driver code
sol = Solution()
height = [3, 0, 2, 0, 4]
print(sol.trap(height))left_max[i] = max(left_max[i - 1], height[i]) # track tallest bar from left
build left max array to know tallest bar to the left of each position
right_max[i] = max(right_max[i + 1], height[i]) # track tallest bar from right
build right max array to know tallest bar to the right of each position
water_level = min(left_max[i], right_max[i])
water level at current bar limited by smaller tallest bar on either side
trapped_water += water_level - height[i] # water trapped on current bar
add trapped water at current bar to total