84. 柱状图中最大的矩形

class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> S;
heights.push_back(0);
S.push(-1);
int max_area = 0;
for(int ii = 0; ii < heights.size(); ii++) {
while(S.top() != -1 && heights[ii] <= heights[S.top()]) {
int height = heights[S.top()];
S.pop();
max_area = max(max_area, height * (ii - S.top() - 1));
}
S.push(ii);
}
return max_area;
}
};

class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
int max_area = 0;
vector<int> left(n, 0);
vector<int> right(n, 0);
for(int ii = 0; ii < n; ii++) {
int jj = ii - 1;
while(jj >= 0 && heights[jj] >= heights[ii]) jj = left[jj];
left[ii] = jj;
}
for(int ii = n-1; ii >= 0; ii--) {
int jj = ii + 1;
while(jj < n && heights[jj] >= heights[ii]) jj = right[jj];
right[ii] = jj;
max_area = max(max_area, heights[ii] * (right[ii] - left[ii] - 1));
}
return max_area;
}
};