free website counter

Leetcode:Maximal Rectangle

Maximal Rectangle

  • 给一个二维数组,用0,1填充,找出包含1的矩形的最大面积。

思路

  • 开始想到的思路是,比较好的时间复杂度应该是n方,动态规划(似乎看到二维数组,首先就想到DP,估计跟最近做的几个二维DP的题目有关,还是得好好总结,建立方法论)。即f[i][j]纪录以matrix[i][j]为右下顶点的矩形的最大面积。但是这样出现了一个问题,到f[i][j]的转移方程没法写,无法从f[i-1][j]/f[i][j-1]得到,思维还是存在漏洞。
  • 正确思路:这个题目应该跟一维数组时,求最大能够容纳的水容量,或者是两根柱子组成的面积最大,连续整数的最大长度这些题一个类型,只是把数组从一维变成了二维。这样的话,按照原来两遍夹逼的思路。两个全局的数组L,R,对每一列都适用,即纪录当前行位置,第j列的最大允许的左边界以及右边界。两个局部的指针left,right,纪录当前行每个位置的左边界与右边界。并且通过left与right去更新L,R数组。

完整代码:

class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        if (matrix.empty())
            return 0;
        int m = matrix.size();
        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(left, L[j]);
                }
                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(right, R[j]);
                    ret = max(ret, H[j]*(R[j]-L[j]));
                }
                else {
                    right = j;
                }
            }
        }
        return ret;
    }
};
Published 05 November 2014
分享按钮