leetcode42.接雨水---Java

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

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

思路:这道题我的思路是使用单调栈来进行求解,栈中存放的是墙的下标。当current指向的墙比当前栈顶的墙低时,说明可以存水,即压入栈;如果比当前栈顶的墙高,则栈中元素进行弹出,并计算积攒的雨水量。先判断左右墙的高度,取最低的:

//确定左右最低高度
int min = Math.min(height[stack.peek()],height[current]);

同时,需要计算下两个墙之间的距离:

//计算距离
int distance = current - stack.peek()-1;

所以当前的积水就等于:最低墙的高度减去上次弹出墙的高度:

 sum = sum + distance*(min-h);

代码:

class Solution {
    public int trap(int[] height) {
        int sum = 0;//用来计算积水
        Stack<Integer> stack = new Stack<>();//存的是下标
        int current = 0;
        while(current < height.length){
            //当栈不为空,且值比栈顶大时,需要执行弹出和计算积水
            while(!stack.isEmpty() && height[current] >height[stack.peek()]){
                int h = height[stack.pop()];//计算弹出的元素高度
                //stack.pop();
                if(stack.isEmpty()){
                    break;//如果为空,直接跳出
                }
                //计算距离
                int distance = current - stack.peek()-1;
                //确定左右最低高度
                int min = Math.min(height[stack.peek()],height[current]);
                sum = sum + distance*(min-h);
            }
            stack.push(current);
            current++;
        }
        return sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值