less than 1 minute read

<-H 85> Maximal Rectangle

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty())
            return 0;

        const int m = matrix.size();
        const int n = matrix[0].size();

        vector<int> H(n, 0);
        vector<int> L(n, 0);
        vector<int> R(n, n);

        int ret = 0;

        for(int i = 0; i < m; i++) {
            int left = 0, right = n;
            for(int j = 0; j < n; j++) {
                if(matrix[i][j] == '1') {
                    H[j]++;
                    L[j] = max(L[j], left);
                }
                else {
                    left = j + 1;
                    H[j] = 0;
                    L[j] = 0;
                    R[j] = n;
                }
            }
            for(int j = n - 1; j >= 0; j--) {
                if(matrix[i][j] == '1') {
                    R[j] = min(R[j], right);
                    ret = max(ret, H[j] * (R[j] - L[j]));
                }
                else{
                    right = j;
                }
            }
        }

        return ret;
    }
};