42. 接雨水
class Solution {
public:
int trap(vector<int>& height) {
stack<int> st;
int sum=0;
for(int i=0;i<height.size();i++){
while(!st.empty()&&height[i]>height[st.top()]){
int mid=height[st.top()];
st.pop();
if(!st.empty()){
int h=min(height[i],height[st.top()])-mid;
int w=i-st.top()-1;
sum+=h*w;
}
}
st.push(i);
}
return sum;
}
};
接雨水用单调栈来做,具体思路是求出体积的高和宽,stack容器储存的是数组下标,单调栈单调递增,遍历到元素比栈顶元素大时,此时栈顶元素为容器的低,元素为右侧的边,记录此时栈顶数组下标对应的值作为底边,然后pop掉,如果栈不为空,那么此时的栈顶元素对应的值就是左侧边,然后根据木桶效应取短边减去底边高,而体积的宽为i-stack.top()-1,计算得到体积值,最后sum累加体积值
84.柱状图中最大的矩形
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
heights.insert(heights.begin(),0);
heights.push_back(0);
int result=0;
for(int i=0;i<heights.size();i++){
while(!st.empty()&&heights[i]<heights[st.top()]){
int mid=st.top();
st.pop();
if(!st.empty()){
int h=heights[mid];
int w=i-st.top()-1;
result=max(result,h*w);
}
}
st.push(i);
}
return result;
}
};
这道题数组前后都要插入0,因为数组单调递增或者单调递减都会导致无法更新出最大矩形值,这是和接雨水题不一样的地方。具体思路是单调栈单调递减,当元素比栈顶元素小时,元素作为右边,此时的栈顶元素作为右边,st.pop(),现在的栈顶元素作为左边。h=height[mid],w=i-st.top()-1.