单调栈
力扣.42
public class waterTrap {
public static void main(String[] args) {
System.out.println(new waterTrap().trap(new int[]{2, 1, 0, 2}));
}
public int trap(int[] height) {
if (height == null) {
return 0;
}
Stack<Integer> stack = new Stack<>();
int ans = 0;
for(int i=0;i<height.length;i++){
while (!stack.empty()&&height[stack.peek()]<height[i]){
int curIndex = stack.pop();//指向当前栈顶元素
// 如果栈顶元素一直相等,那么全都pop出去,只留第一个。
while (!stack.isEmpty() && height[stack.peek()] == height[curIndex]) {
stack.pop();
}
//将栈顶元素pop后,可能出现栈为空的情况,即当前元素已经比之前所有元素都要高,此时也已经无法收集雨水
if (!stack.empty()){
int h = Math.min(height[stack.peek()], height[i]) - height[curIndex];
int w = i - stack.peek()-1;//注意不能使用curIndex-stack.peek(),宽度是指从当前(即较高的那个柱子
ans += h * w;
}
}
stack.add(i);
}
return ans;
}
}