单调栈分为单调递增栈和单调递减栈。
操作规则:(下面都以单调递增栈为例)
如果新的元素比栈顶元素大,就入栈
如果新的元素较小,那就一直把栈内元素弹出来,直到栈顶比新元素小
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < nums.size(); i++)
{
while(! stack.isEmpty() && stack.peek() > nums[i])
{
st.pop();
}
st.push(nums[i]);
}
力扣42 接雨水
https://blog.csdn.net/weixin_39248750/article/details/122921911
public int trap(int[] height){
if(height==null) return 0;
int res=0;
Stack<Integer> stack = new Stack<>();
for(int i=0;i<height.length;i++){
while(!stack.isEmpty()&&height[stack.peek()]<height[i]){
int curIndex=stack.pop();
while(!stack.isEmpty()&&height[stack.peek()]==height[curIndex]){
stack.pop();
}
if(!stack.isEmpty()){
int stackTop=stack.peek();
res+=(Math.min(height[stackTop],height[i])-height[curIndex])*(i-stackTop-1);
}
}
stack.push(i);
}
return res;
}
力扣84 柱状图中最大的