给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入: 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 stack = new Array(height.length).fill(0);
let maxValue = 0;
for(let i = 0;i < height.length;i++){
while(stack.length && (height[i] > height[stack[stack.length -1]])){
let mid = stack.pop();
if (stack.length === 0) {
break;
}
let left = stack[stack.length - 1];
let right = i;
maxValue += (Math.min(height[left],height[right]) - height[mid]) * (i - left -1)
}
stack.push(i)
}
return maxValue
};
- 求取了当前雨水左侧第一个更大的元素,以及右侧更大的元素,因此用单调栈。
- 并且是单调递增,因为只有更大的元素,才有必要去弹出栈。
- 但是你这个题,要去注意到里面的栈弹出后,是否还存在,避免空栈访问