单调栈即栈内元素满足单调性的栈,可以线性复杂度的遍历数组得到
LeetCode 84. 柱状图中最大矩阵:
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
解析:
利用单调栈且栈内元素单调递增的特性。我们可以知道,如果当前元素入栈时且比栈顶元素大,则直接入栈,否则循环出栈栈顶元素(出栈的元素的右边界就是当前元素)直到栈中无元素或比栈顶元素大为止。
Talk is cheap. Show me the code!
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> s;
s.push(-1);
int res = 0;
int size = heights.size();
for(int i = 0; i < size; ++i){
// 否则....
while(s.top() != -1 && heights[i] < heights[s.top()]){
int h = heights[s.top()];
s.pop();
res = max(res, h * (i - s.top() - 1));
}
s.push(i);
}
// 这步别漏了,栈内还有元素
while(s.top() != -1){
int h = heights[s.top()];
s.pop();
res = max(res, h * (size - s.top() - 1));
}
return res;
}
};
理解后可以试着解决本题目的延伸题目: