class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n=heights.size();
int i,j,k;
int ans=0;
for(i=0;i<n;i++){
for( j=i-1;j>=0;j--){
if(heights[j]<heights[i]) break;
}
for( k=i+1;k<n;k++){
if(heights[k]<heights[i]) break;
}
ans=max(heights[i]*(k-j-1),ans);
}
return ans;
}
};
单调栈
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> left(n), right(n);
stack<int> mono_stack;
for(int i=0;i<n;i++){
while(!mono_stack.empty()&&heights[i]<=heights[mono_stack.top()]){
mono_stack.pop();
}
left[i]=mono_stack.empty()?-1:mono_stack.top();
mono_stack.push(i);
}
mono_stack=stack<int>();
for(int i=n-1;i>=0;i--){
while(!mono_stack.empty()&&heights[i]<=heights[mono_stack.top()]){
mono_stack.pop();
}
right[i]=mono_stack.empty()?n:mono_stack.top();
mono_stack.push(i);
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(ans,heights[i]*(right[i]-left[i]-1));
}
return ans;
}
};
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
vector<int> left(n), right(n);
stack<int> mono_stack;
for(int i=0;i<n;i++){
while(!mono_stack.empty()&&heights[i]<=heights[mono_stack.top()]){
right[mono_stack.top()]=i;
mono_stack.pop();
}
left[i]=mono_stack.empty()?-1:mono_stack.top();
mono_stack.push(i);
}
while(!mono_stack.empty()){
right[mono_stack.top()]=n;
mono_stack.pop();
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(ans,heights[i]*(right[i]-left[i]-1));
}
return ans;
}
};
python
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack=list()
n=len(heights)
left=[0]*n
right=[n]*n
ans=0
for i in range(n):
while stack and heights[i]<=heights[stack[-1]]:
right[stack[-1]]=i
stack.pop()
left[i]= stack[-1] if stack else -1
stack.append(i)
# while stack:
# right[stack[-1]]=n
# stack.pop()
for i in range(n):
ans=max(ans,(right[i]-left[i]-1)*heights[i])
return ans