Skip to content
js
/*
 * @lc app=leetcode.cn id=42 lang=javascript
 *
 * [42] 接雨水
 */

// @lc code=start
/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function (height) {
  // 一开始水的面积
  var result = 0;
  // 存储height的下标
  var stack = [];
  for (let i = 0; i < height.length; i++) {
    // 如果元素大于栈顶元素,有可能形成凹槽
    while (stack.length > 0 && height[i] > height[stack[stack.length - 1]]) {
      let bottom =  stack.pop();
      // 没有左侧了
      if (!stack.length) {
        break;
      }
      // 凹槽左侧的高度 和 凹槽右侧的高度 height[i]
      // 这两者的最小值减去凹槽底部的高度就是凹槽的高度
      const left = stack[stack.length - 1];
      var h = Math.min(height[left], height[i]) - height[bottom];
      // 凹槽宽度
      var w = i - left - 1;
      result += h * w;
    }
    // 栈中和此时的元素可以形成栈的情况在上述 while 循环中都已经判断了
    // 那么,此时栈中的元素必然不可能大于此时的元素,所以可以把此时的元素添加到栈中
    stack.push(i);
  }
  return result;
};
// @lc code=end

trap([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]);

上次更新于: