给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
LeetCode: https://leetcode.cn/problems/trapping-rain-water/submissions/
class Solution {
func trap(_ height: [Int]) -> Int {
guard height.count > 2 else { return 0 }
// 左右做高点
var maxL = height.first!
var maxR = height.last!
// 左右指针
// 双指针从左右分别向中间移动,遇到高点更新高点,遇到低点更新水量
var L = 0
var R = height.count - 1
// 结果
var res = 0
while L < R {
if maxL <= maxR {
// 左边高点比右边矮,则左边指针右移
L += 1
if height[L] >= maxL {
// 遇到左侧新高
maxL = height[L]
} else {
// 遇到左侧低点,则形成洼地,储水增加
res += maxL - height[L]
}
} else {
// 右边高点比左边矮,则右边指针左移
R -= 1
if height[R] >= maxR {
// 遇到右侧新高
maxR = height[R]
} else {
// 遇到右侧低点,则形成洼地,储水增加
res += maxR - height[R]
}
}
}
return res
}
}