题目描述
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆
这个问题是典型的单调栈问题
主要代码
思考过程
- 下标 i 处的雨水能达到的高度等于其两边的最大高度的最小值,下标 i 处的雨水能达到的高度与 height[i] 之差即为下标 i 处的雨水量。只要得到每个下标处的两边最大高度,即可得到能接的雨水总量
- 创建两个长度为 n 的数组 left[height.length] 和 right[height.length],对于 0 ≤ i ≤ n , left[i] 表示 height[] 在下标范围 [0,i] 内的最大元素,right[i] 表示 height[] 在下标范围 [i,n − 1] 内的最大元素。