【单调栈 单调递减栈 宽度是当前减弹出后的新栈顶(左右比自己高的相减) 高度是两个进行比较 】 42接雨水

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
在这里插入图片描述
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

思路

单调递减栈:当找到一根比前面高的柱子,就可以接雨水,当后面的比前面的低就不可以接。因此相当于寻找右边第一个更大的,那么就是单调递减栈。
雨水的区域:右边的目前遍历到的数字,底部是栈顶,左边是栈顶的前一个。
计算:水坑高度——左右两边更低的元素减去底部。宽度:左右下标差。
如果出栈后栈为空,则不计算面积。将当前入栈,进行下一次循环。

代码

public int trap(int[] height) {
    //建立单调递减栈,找右边第一个更大的
    int len = height.length;
    int sum = 0;
    Deque<Integer> stack = new LinkedList<>();
    for(int i = 0;i<len;i++){
        int cur = height[i];
        while(!stack.isEmpty()&&cur>height[stack.peek()]){
            int preindex = stack.pop();
            //出栈后栈为空就不计算
            if(!stack.isEmpty()){
                int l = stack.peek();
                int r = i;
                int h = Math.min(height[l],height[r]);
                sum+=(h-height[preindex])*(r-l-1);

            }
        }
        stack.push(i);

    }
    return sum;


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值