给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> sta;
vector<int> heightsCp;
heightsCp.assign(heights.begin(), heights.end());
heightsCp.push_back(-1);
int maxRes = -1;
for(int i = 0; i < heightsCp.size(); i++)
{
while(!sta.empty() && heightsCp[i] < heightsCp[sta.top()])
{
int height = heightsCp[sta.top()];
sta.pop();
int weight = (sta.empty() ? i : i-sta.top()-1);
maxRes = max(maxRes, height*weight);
}
sta.push(i);
}
return maxRes;
}
};
使用单调栈矩阵索引,找到矩阵的高度和左右边沿
右边沿:右边第一个矮于当前栈顶元素A的柱子
左边沿:单调栈中紧临栈顶A的柱子,如果A已出栈,左边沿就是A出栈后的栈顶,若A出栈后栈为空,说明A出栈后左边沿没有比它矮的,左边沿可以到栈顶0
具体思路可参考该帖:https://blog.csdn.net/Zolewit/article/details/88863970