单调栈
例题:leetcode 84. 柱状图中最大的矩形 | leetcode 85. 最大矩形 | 网易笔试 [编程题]放置货物
柱状图中最大的矩形
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
// 单调栈
// 维护一个从栈底到栈顶保持递增的单调栈
// 扫描柱状图,若当前元素大于等于栈顶元素,则当前元素入栈
// 否则,对单调栈进行pop()操作,直到栈顶元素不大于当前元素,当前元素入栈
// 每一次pop操作计算一次矩形面积
// 注意,每一次被pop的栈顶元素h,以h为高度的最大宽度为[下一个栈顶元素的下标+1,当前元素所在下标)的左闭右开空间
int maxArea = 0;
if (heights.size() == 0)return 0;
heights.insert(heights.begin(), 0); // 避免#1处underflow
heights.push_back(0); // 使得最后st的全部非负整数元素pop()出来
stack<int> st; // 存储heights的下标的height单调递增栈
for (int i = 0; i < heights.size(); i++)
{
int cur=0;
while (!st.empty() && heights[st.top()] > heights[i])
{
cur = st.top();
st.pop();
int curArea= heights[cur] * (i - st.top()-1); // #1
maxArea = max(maxArea,curArea);
}
st.push(i);
}
return maxArea;
}
};