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;
}
};
学习参考:力扣
该文章介绍了如何使用单调栈优化算法来求解一组柱状图中能构成的最大矩形面积,通过遍历柱子高度并维护一个单调递增栈,确定柱子的左右边界以计算面积,并更新最大面积。这种方法具有O(N)的时间和空间复杂度。
4576

被折叠的 条评论
为什么被折叠?



