LEETCODE maximal-rectangle Solution

| August 01, 2015

The correct, optimal and working solution for programming question maximal-rectangle on leetcode

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        
        int result = INT_MIN;
        int row = matrix.size();
        
        if( row == 0 ) {
            return 0;
        }
        
        int col = matrix[0].size();
        
        /*if( row == 1 && col == 1 ) {
            return matrix[0][0] - '0';
        }*/
        
        int array[row][col];
        
        for( int i = 0 ; i < row ; i++ ) {
            for( int j = 0 ; j < col; j++ ) {
                if( i == 0 ) {
                    array[i][j] = matrix[i][j] - '0';
                }
                else {
                    if( matrix[i][j] == '0' ) {
                        array[i][j] = 0;
                    }
                    else {
                        // matrix[i][j] has to be 1
                        array[i][j] = array[i-1][j] + (matrix[i][j] - '0');
                    }
                }
            }
            
            stack<int> s;
            int k = 0;
            int m = INT_MIN;
            while( k < col ) {
                if( s.empty() || array[i][k] > array[i][s.top()] ) {
                    s.push(k);
                    k++;
                }
                else {
                    int tp = s.top();
                    s.pop();
                    
                    int h = array[i][tp];
                    int w = (s.empty()) ? k : (k - s.top() - 1);
                    int area = h * w;
                    m = max(m,area);
                }
            }
            
            while( s.empty() == false ) {
                int tp = s.top();
                s.pop();
                int h = array[i][tp];
                int w = (s.empty()) ? k : (k - s.top() - 1);
                int area = h * w;
                m = max(m,area);
            }
            
            result = max(result,m);
            
        }
        return result;
    }
};