题目:EPI
int calculate_largest_rectangle(const vector<int> &A)
{
if (A.empty())
return -1;
stack<int> s;
vector<int> left(A.size());
vector<int> right(A.size());
//计算左边边界
for (int i = 0; i < A.size(); i++)
{
while (!s.empty() && A[s.top()] >= A[i])
s.pop();
//s.empty()时,表示左边没有限制,可以一直到A[0]
left[i] = s.empty() ? 0 : s.top() + 1;
s.push(i);
}
while (!s.empty())
s.pop();
//计算右边边界
for (int i = A.size() - 1; i >= 0; i--)
{
while (!s.empty() && A[s.top()] >= A[i])
s.pop();
//s.empty()时,表示右边没有限制,可以一直到A[A.size()-1]
right[i] = s.empty() ? A.size() - 1 : s.top() - 1;
s.push(i);
}
//计算最大矩阵
int max = -1;
for (int i = 0; i < A.size(); i++)
{
//A[i]是矩阵的高,right[i] - left[i] + 1是矩阵的宽(沿数轴)
int tmp = A[i] * (right[i] - left[i] + 1);
if (tmp > max)
max = tmp;
}
return max;
}