1.核心思想:求每条柱子可以向左右延伸的长度->矩形最大宽度;矩形的高->柱子的高度计算以每根柱子高度为高的矩形面积,维护面积最大值。
2.朴素的想法:遍历每一根柱子的高度然后向两边进行扩散找到最大宽度。
3.单调栈优化:因为最终的目的是寻找对应柱子height[i]右边首个严格小于height[i]的柱子height[r];左边同理找到首个严格小于height[i]的柱子height[l];维护一个单调递增栈(栈底->栈顶),那么每当遇到新加入的元素<栈顶便可以确定栈顶柱子右边界,而栈顶柱子左边界就是栈顶下面的柱子(<栈顶柱子)。左右边界确定以后进行面积计算与维护最大面积。
空间复杂度:O(N),空间复杂度:O(N)
代码:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> stk;
heights.insert(heights.begin(), 0);
heights.push_back(0);
int ans = 0, sz = heights.size();
for (int i = 0; i < sz; ++i) {
while (!stk.empty() && heights[stk.top()] > heights[i]) {
int top = stk.top();
stk.pop();
int left = stk.top() + 1;
int right = i - 1;
ans = max(ans, (right - left + 1) * heights[top]);
}
stk.push(i);
}
return ans;
}
};
学习参考:力扣