Skip to main content

接雨水

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图, 计算按此排列的柱子, 下雨之后能接多少雨水.

提示:
  • n == height.length
  • 1 <= n <= 2 * 10⁴
  • 0 <= height[i] <= 10⁵
示例

42-trap

输入: height = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]

输出: 6

解释: 上面是由数组 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1] 表示的高度图, 在这种情况下, 可以接 6 个单位的雨水(蓝色部分表示雨水).

题解

/**
* @param {number[]} height
* @return {number}
*/
var trap = function (height) {
let ans = 0
let left = 0,
right = height.length - 1
let leftMax = 0,
rightMax = 0

while (left < right) {
leftMax = Math.max(leftMax, height[left])
rightMax = Math.max(rightMax, height[right])

// 左指针的 leftMax 比右指针的 rightMax 矮
// 说明左指针的右边至少有一个板子 > 左指针左边所有板子
// 根据水桶效应, 保证了左指针当前列的水量决定权在左边
// 那么可以计算左指针当前列的水量: 左边最大高度 - 当前列高度
if (height[left] < height[right]) {
ans += leftMax - height[left]
left++
} else {
ans += rightMax - height[right]
right--
}
}

return ans
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)