I solved this problem using brute force. The stack-based algorithm for finding the largest rectangle in a histogram seemed to have a high worst-case complexity.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public :
int maximalRectangle ( vector < vector < char >> & matrix ) {
int max = 0 ;
int ** map = new int * [ matrix . size ()];
for ( int i = 0 ; i < matrix . size (); i ++ ) {
map [ i ] = new int [ matrix [ 0 ]. size ()];
}
for ( int i = 0 ; i < matrix . size (); i ++ ) {
int height = 0 ;
for ( int j = matrix [ 0 ]. size () - 1 ; j >= 0 ; j -- ) {
if ( matrix [ i ][ j ] == '1' ) map [ i ][ j ] = ++ height ;
else {
height = 0 ;
map [ i ][ j ] = height ;
}
}
}
for ( int i = 0 ; i < matrix . size (); i ++ ) {
for ( int j = 0 ; j < matrix [ 0 ]. size (); j ++ ) {
int width = map [ i ][ j ];
max = Max ( max , width );
for ( int k = i + 1 ; k < matrix . size (); k ++ ) {
if ( map [ k ][ j ] == 0 ) break ;
else {
width = Min ( width , map [ k ][ j ]);
max = Max ( max , width * ( k - i + 1 ));
}
}
}
}
return max ;
}
private :
int Max ( int a , int b ) {
return a > b ? a : b ;
}
int Min ( int a , int b ) {
return a < b ? a : b ;
}
};
Licensed under CC BY-NC-SA 4.0