柱状图中最大的矩形
题目链接: 力扣
假设以柱子1(指值为1的柱子)为基准,柱子1的左侧没有比柱子1矮的元素,所以柱子1可以无限像左边扩展,柱子1的右侧也没有比柱子1矮的元素,所以柱子1可以无限向右边扩展,
所以柱子1的高度可以贯彻整个柱状图,即以柱子1为高度的面积为:1*6=6
以柱子5为基准,柱子5左侧没有比柱子5矮的柱子,说明柱子5左边不能进行扩展了,而柱子5右边第一个比柱子5小的柱子是柱子2,这说明柱子5能够扩展到柱子2(不包含柱子2)
以此,我们要求的就是一个柱子左边和右边第一个比其小的柱子。
所以这题和“接雨水”那道题是类似的,
只不过 接雨水 求得是一个柱子左边和右边第一个比其大的柱子。
所以此时的单调栈是一个单调递减的单调栈了。
当当前元素大于或等于栈顶元素时,将该元素投入单调栈中
当当前元素小于栈顶元素时,比较此时栈顶元素右边元素、栈顶元素、当前元素的大小关系。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
stack<int> Mystack;
heights.insert(heights.begin(),0);
heights.push_back(0);
Mystack.push(0);
for(int i=1; i<heights.size();i++)
{
if(heights[i] >= heights[Mystack.top()])
{
Mystack.push(i);
}
else if(!Mystack.empty() && heights[i]<heights[Mystack.top()])
{
while(!Mystack.empty() && heights[i]<heights[Mystack.top()])
{
int mid = Mystack.top();
Mystack.pop();
if(Mystack.empty())
break;
int h = heights[mid];
int w = i-Mystack.top()-1;
result=max(result,h*w);
}
Mystack.push(i);
}
}
return result;
}
};