#include<vector> #include<stack> using std::vector; using std::stack;
classSolution { public: intlargestRectangleArea(vector<int> &heights) { int i, n = heights.size(), max_area = 0; vector<int> left(n, 0); vector<int> right(n, n - 1); stack<int> stk1, stk2;
for (i = 0; i < n; i++) { while (!stk1.empty() && heights[i] < heights[stk1.top()]) { right[stk1.top()] = i - 1; // 右边界 stk1.pop(); } stk1.push(i); }
// while (!stk.empty()) { // right[stk.top()] = n - 1; // }
for (i = n - 1; i >= 0; i--) { while (!stk2.empty() && heights[i] < heights[stk2.top()]) { left[stk2.top()] = i + 1; // 左边界 stk2.pop(); } stk2.push(i); }
// while (!stk.empty()) { // left[stk.top()] = 0; // }
for (i = 0; i < n; i++) max_area = std::max(max_area, (right[i] - left[i] + 1) * heights[i]);