Use two pointers (left and right) with left_max and right_max variables. The trapped water at any index is bounded by min(left_max, right_max) minus height[i].
class Solution:
def trap(self, height: list[int]) -> int:
if not height: return 0
l, r = 0, len(height) - 1
left_max, right_max = height[l], height[r]
res = 0
while l < r:
if left_max < right_max:
l += 1
left_max = max(left_max, height[l])
res += left_max - height[l]
else:
r -= 1
right_max = max(right_max, height[r])
res += right_max - height[r]
return res
class Solution {
public int trap(int[] height) {
if (height == null || height.length == 0) return 0;
int l = 0, r = height.length - 1;
int leftMax = height[l], rightMax = height[r];
int res = 0;
while (l < r) {
if (leftMax < rightMax) {
l++;
leftMax = Math.max(leftMax, height[l]);
res += leftMax - height[l];
} else {
r--;
rightMax = Math.max(rightMax, height[r]);
res += rightMax - height[r];
}
}
return res;
}
}