题目:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
思路:利用单调栈来解决。
class Solution {
public int trap(int[] height) {
Stack<Integer> stack = new Stack<>(); // 记录柱子的高度,保证是 单调栈,栈底到栈顶依次递增
Stack<Integer> indexStack = new Stack<>(); // 记录对应栈里面元素的下标值 index
int result = 0;
for(int index=0;index<height.length;index++){
int h = height[index];
if(stack.isEmpty()){
stack.push(h);
indexStack.push(0);
} else {
if(stack.peek() >= h){ // 当前柱子高度小于等于栈顶高度,直接入栈
stack.push(h);
indexStack.push(index);
} else {
while (h>stack.peek()&&!stack.isEmpty()) { // 循环执行下面步骤,直到栈满足单调栈 或者为空 截止
int tmp = stack.pop();
int tmpIndex = indexStack.pop();
if(stack.isEmpty()){
break;
}
int highNum = Math.min(stack.peek(), h); // 取最矮的柱子与弹出元素的高度差
result += (highNum - tmp) * (index - indexStack.peek() - 1); // 高度差 * 长度
}
stack.push(h);
indexStack.push(index);
}
}
}
return result;
}
}