YSMull
<-- algorithm



原题链接

维护一个单调递减栈。这个栈存放柱子的下标,根据柱子的高度单调递减。
如图所示,i 是当前考察的柱子,top 指向栈顶,left 指向栈顶弹出后的下一个栈顶。
每当遇到一个高度大于 top 的柱子时,我们从栈顶一个一个的向左注水。

\[w = i - left - 1\] \[h = \min \{ H_{i}, H_{left} \} - H_{top}\]

每遇到一根柱子,都从栈顶开始,消除高度小于等于他的柱子。

class Solution {
    public int trap(int[] height) {
        LinkedList<Integer> stk = new LinkedList<>();
        int res = 0;
        for (int i = 0; i < height.length; i++) {
            while (!stk.isEmpty() && height[i] > height[stk.peek()]) {
                int top = stk.pop();
                if (stk.isEmpty()) break;
                int left = stk.peek();
                int w = i - left - 1;
                int h = Math.min(height[i], height[left]) - height[top];
                res += w * h;
            }
            // 此时要么栈为空,要么当前元素小于栈顶元素
            stk.push(i);
        }
        return res;
    }
}