题目
前沿
这个题目和之前接雨水的题目类似,也是去找到两边边界,通过优化枚举合适的高度来实现最大的面积的计算。
代码
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//枚举高度,然后将高度向两边扩大
if(heights.size()==0) return 0;
//用单调栈计算左右两边的最低高度
stack<int> S;
int n = heights.size();
vector<int> left(n, -1);
for(int i =0 ;i<n;i++){
while(!S.empty() && heights[S.top()] >= heights[i]){
S.pop();
}
left[i] = S.empty() ? -1: S.top();
S.push(i);
}
S = stack<int>();
vector<int> right(n, 0);
for(int i=n-1;i>=0;i--){
while(!S.empty() && heights[S.top()] >= heights[i]){
S.pop();
}
right[i] = S.empty() ? n: S.top();
S.push(i);
}
//at present
int ret = 0;
for(int i=0;i<n;i++){
ret = max(ret, (right[i]-left[i]-1)*heights[i]);
}
return ret;
}
};