84. 柱状图中最大的矩形
class Solution {
public :
int largestRectangleArea ( vector< int > & heights) {
stack< int > S;
heights. push_back ( 0 ) ;
S. push ( - 1 ) ;
int max_area = 0 ;
for ( int ii = 0 ; ii < heights. size ( ) ; ii++ ) {
while ( S. top ( ) != - 1 && heights[ ii] <= heights[ S. top ( ) ] ) {
int height = heights[ S. top ( ) ] ;
S. pop ( ) ;
max_area = max ( max_area, height * ( ii - S. top ( ) - 1 ) ) ;
}
S. push ( ii) ;
}
return max_area;
}
} ;
class Solution {
public :
int largestRectangleArea ( vector< int > & heights) {
int n = heights. size ( ) ;
int max_area = 0 ;
vector< int > left ( n, 0 ) ;
vector< int > right ( n, 0 ) ;
for ( int ii = 0 ; ii < n; ii++ ) {
int jj = ii - 1 ;
while ( jj >= 0 && heights[ jj] >= heights[ ii] ) jj = left[ jj] ;
left[ ii] = jj;
}
for ( int ii = n- 1 ; ii >= 0 ; ii-- ) {
int jj = ii + 1 ;
while ( jj < n && heights[ jj] >= heights[ ii] ) jj = right[ jj] ;
right[ ii] = jj;
max_area = max ( max_area, heights[ ii] * ( right[ ii] - left[ ii] - 1 ) ) ;
}
return max_area;
}
} ;