接雨水--单调栈

73 阅读1分钟

 接雨水

给定 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
};

  1. 求取了当前雨水左侧第一个更大的元素,以及右侧更大的元素,因此用单调栈。
  2. 并且是单调递增,因为只有更大的元素,才有必要去弹出栈。
  3. 但是你这个题,要去注意到里面的栈弹出后,是否还存在,避免空栈访问