85. Maximal Rectangle

题目描述:给二维0/1矩阵,找到其中只包含1的,且最多的子矩阵,返回其大小。如:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 6.

分析:这道题被标记为动态规划,如果是一维的就可以设计数器直接记录后刷新max,二维的就要记录包含1的矩形区域的大小。设置数组记录当前行的每一列中1出现的最右侧的左边界,R[n]记录当前行的每一列中1出现的最左侧的右边界,则R[n]-L[n]就是本行最多的连续1所在的矩形的长,H[n]记录本列可构成最大矩形的高。时间复杂度O(n^2),空间O(1)。

代码

class Solution {
public:
    int maximalRectangle(vector>& matrix) {
        if (matrix.empty()) return 0;
        
        int m = matrix.size();
        int n = matrix[0].size();
        vector h(n, 0);
        vector l(n, 0);
        vector 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;
    }
};

你可能感兴趣的:(85. Maximal Rectangle)