思路:
这道题运用的算法是单调栈,先对每个元素进行左右两边查找小于该元素的值的下标,用两个容器进行存储找到的下标,方便后面直接运用,通过右 — 左得到的是宽度,再乘以该元素即可(因为该元素就是高)。
代码:
class Solution {
public:
stack<int> left;
stack<int> right;
vector<int> q;
int largestRectangleArea(vector<int>& heights) {
for(int i=0;i<heights.size();++i){
while(left.size() && heights[left.top()]>=heights[i]) left.pop();
left.size()==0 ? q.push_back(-1) : q.push_back(left.top());
left.push(i);
}
vector<int> p;
for(int i=heights.size()-1;i>=0;--i){
while(right.size() && heights[right.top()]>=heights[i]) right.pop();
right.size()==0 ? p.push_back(heights.size()) : p.push_back(right.top());
right.push(i);
}
long long ans = 0;
for(int i=0;i<heights.size();++i){
int k = (p[heights.size()-i-1]-q[i]-1) * heights[i];
if(ans<k) ans=k;
}
return ans;
}
};