84.柱状图中最大的矩形
# include <algorithm>
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
stack<int> st;
int maxArea=0;
st.push(0);
for (int i=0; i<heights.size(); i++){
if (heights[i]>=heights[st.top()]){ // 维护一个单调递增栈,即所有柱子都满足比前一个大,这样当出现比栈顶元素大的元素就可以保证后面的元素可以形成一个逐渐变矮但是越来越宽矩形
st.push(i);
}
else{
while (!st.empty() && heights[i] < heights[st.top()]) { // 当下一个元素更小时
int h = heights[st.top()]; // 栈顶元素对应的height值为高
st.pop(); // 栈顶后的元素即现在的st.top()与之前的栈顶元素i-1,形成宽
int w = st.empty() ? i : i - st.top() - 1;
maxArea = max(maxArea, h * w);
}
st.push(i);
}
}
return maxArea;
}
};
谢谢卡哥