剑指 Offer II 039. 直方图最大矩形面积
题目链接:剑指 Offer II 039. 直方图最大矩形面积
方法:单调栈
解题思路
- 以直方图中的某一条为高的最大(面积)矩形的宽度为 (r - l + 1),其中 (r) 表示在其右边第一个小于(或等于)当前高度的下标,(l) 表示在其左边第一个小于当前高度下标。
- (l),(r) 可以利用单调栈在 (O(1)) 时间获取:
- 单调栈存储单调递增的下标;
- 若当前下标对应的高度小于栈顶下标对应的高度,则当前下标就是栈顶下标的 (r);
- 次栈顶下标就是栈顶下标的 (l);
- 计算以每个下标为高的矩形面积最大值,答案取其中的最大值。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> stk;
stk.push(-1);
int ans = 0, n = heights.size();
for (int i = 0; i < n; i ++ ) {
while (stk.top() != -1 && heights[stk.top()] >= heights[i]) {
int h = heights[stk.top()];
stk.pop();
ans = max(ans, h * (i - stk.top() - 1));
}
stk.push(i);
}
while (stk.top() != -1) {
int h = heights[stk.top()];
stk.pop();
ans = max(ans, h * (n - stk.top() - 1));
}
return ans;
}
};
复杂度分析
时间复杂度:(O(n));
空间复杂度:(O(n))。
原文地址:https://www.cnblogs.com/lxycoding/p/17441173.html