LeetCode 84. 柱状图中最大的矩形
使用单调栈实现O(n)复杂度求每根柱子高度对应矩形的左右边界,这是自己头一回接触单调栈,代码思路参考了LeetCode官方题解。
代码实现:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if (0 == heights.size()) return 0;
int n = heights.size();
vector<int> left(n), right(n);
stack<int> mono_stack;//单调栈寻找左右边界
//求每根柱子的左边界
for (int i = 0; i < n; ++i) {
while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {
mono_stack.pop();
}
left[i] = mono_stack.empty() ? -1 : mono_stack.top();
mono_stack.push(i);
}
mono_stack = stack<int>();
//求每根柱子的右边界
for (int i = n - 1; i >= 0; --i) {
while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {
mono_stack.pop();
}
right[i] = mono_stack.empty() ? n : mono_stack.top();
mono_stack.push(i);
}
//计算最大面积
int maxArea = 0;
for (int i = 0; i < n; ++i) {
maxArea = max(maxArea, (right[i] - left[i] - 1) * heights[i]);
}
return maxArea;
}
};