● 84.柱状图中最大的矩形
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int area = 0;
stack<int> l_st;
stack<int> r_st;
l_st.push(0);
r_st.push(heights.size() - 1);
vector<vector<int>> res(heights.size(), vector<int>(2, -1));
for (int i = 0; i <heights.size(); i ++) res[i][0] = heights.size();
for (int i = 1; i < heights.size(); i ++) {
if (heights[i] >= heights[l_st.top()]) {
l_st.push(i);
}
else {
while (!l_st.empty() && heights[i] < heights[l_st.top()]) {
res[l_st.top()][0] = i;
l_st.pop();
}
l_st.push(i);
}
int j = heights.size() - 1 - i;
if (heights[j] >= heights[r_st.top()]) {
r_st.push(j);
}
else {
while (!r_st.empty() && heights[j] < heights[r_st.top()]) {
res[r_st.top()][1] = j;
r_st.pop();
}
r_st.push(j);
}
}
for (int i = 0; i < heights.size(); i ++) {
//printf("%d %d %d\n", res[i][1], heights[i], res[i][0]);
area = max(area, heights[i] * (res[i][0] - res[i][1] - 1));
}
return area;
}
};