Trapping Rain Water

HardArrayTwo PointersDynamic ProgrammingStackMonotonic Stack

Solution

export function trap(height: number[]): number {
  const n = height.length;
  if (n <= 2) {
    return 0;
  }
 
  let answer = 0;
  let [left, right] = [1, n - 2];
  let maxLeftHeight = height[0];
  let maxRightHeight = height[n - 1];
  while (left <= right) {
    if (maxLeftHeight < maxRightHeight) {
      maxLeftHeight = Math.max(maxLeftHeight, height[left]);
      answer += maxLeftHeight - height[left];
      left += 1;
    } else {
      maxRightHeight = Math.max(maxRightHeight, height[right]);
      answer += maxRightHeight - height[right];
      right -= 1;
    }
  }
  return answer;
}