单调栈真的懂了呀系列《接雨水》

102 阅读1分钟

价值:记录学习过程的思考,本身就是一场动态规划的前生,记忆化搜索。

单调栈:及时去掉无用数据,保证栈中数据有序。

Problem: 42. 接雨水

思路


    // 《单调不增栈》

        //左、左的下一个、当前right
        //计算状态:高度= min(当前right - 左) - 低洼处柱子高度
        //。       横着宽度 right - 左 -1 (内)
        //算完这一块之后,填坑,下一次循环 左、上一次的right(低洼) 、 当前right

Code

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int ans = 0;
        Deque<Integer> stack = new ArrayDeque<>();

        //左、左的下一个、当前right
        //计算状态:高度= min(当前right - 左) - 低洼处柱子高度
        //。       横着宽度 right - 左 -1 (内)
        //算完这一块之后,填坑,下一次循环 左、上一次的right(低洼) 、 当前right
        for(int right = 0; right < n ; right++){
            while(!stack.isEmpty() && height[right] > height[stack.peekLast()]){

                //中间柱子位置
                int bottom = stack.pollLast();

                if(stack.isEmpty()){
                    break;
                }
                //左墙位置 以及左墙、右墙、低洼处高度
                int left = stack.peekLast();

                //取出高度
                int lh = height[left];
                int rh = height[right];
                int bottom_h = height[bottom];

                //围成小坑
                int dh = Math.min(lh,rh) - bottom_h;

                ans += dh * (right - left - 1);
            }
            //用当前right结算完成后,一马平川,继续寻找比栈顶 大的 进行结算低洼处。
            stack.addLast(right);
        }
        return ans;
    }
}