Leetcode 221. Maximal Square

来源:互联网 发布:尤西雷 知乎 编辑:程序博客网 时间:2024/06/07 03:58

题目:

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

For example, given the following matrix:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
Return 4.

大意是给定一个0,1矩阵,求出矩阵中面积最大的全1正方形。

思路:

由于是从动态规划标签选出来的题目,所以就用动态规划的思路去解决该问题。考虑矩阵中某一点(i,j),如果该点为0,那么不存在包含(i,j)的全1正方形,所以包含该点的最大全1正方形面积为0。

如果该点为1,那么包含该点的全1正方形是由上边、左边或左上角的正方形扩展而来。以上边的点为例,假设(i-1,j)的最大全1正方形面积为a^2,如果可以扩展至(i,j),那么(i,j-1)开始向左a个点都应该为1,(i,j-a)及向上a个点都应该为1,很明显左、上、左上各有三个相同面积的全1正方形(如图)。假使左边和左上角的正方形面积比a^2大,(i,j)的最大全1正方形面积仍然不会变。所以(i,j)的全1正方形面积可以由上边的全1正方形面积得到,只要左边和左上角的全1正方形面积不小于a^2。由此,我们可以发现,(i,j)的最大全1正方形面积其实受制于三个方向中全1正方形面积最小的点。


故有转移方程:d[i][j] = min(d[i-1][j-1],d[i][j-1],d[i-1][j]),d[i][j]表示点(i,j)的最大全1正方形边长。

代码如下:

class Solution {public:    int maximalSquare(vector<vector<char> > &matrix) {        if (matrix.size() == 0)            return 0;        const int m = matrix.size(), n = matrix[0].size();        int d[m][n], maxArea = 0;                for (int i = 0; i < matrix[0].size(); i++) {            d[0][i] = matrix[0][i]-'0';            maxArea = d[0][i] > maxArea ? d[0][i] : maxArea;         }        for (int i = 0; i < m; i++) {            d[i][0] = matrix[i][0]-'0';            maxArea = d[i][0] > maxArea ? d[i][0] : maxArea;         }                for (int i = 1; i < m; i++) {            for (int j = 1; j < n; j++) {                if (matrix[i][j] == '0') {                    d[i][j] = 0;                    continue;                }                d[i][j] = d[i-1][j-1] < d[i][j-1] ? d[i-1][j-1]+1 : d[i][j-1]+1;                d[i][j] = d[i][j] < d[i-1][j]+1 ? d[i][j] : d[i-1][j]+1;                maxArea = d[i][j] > maxArea ? d[i][j] : maxArea;             }                    }        return maxArea*maxArea;        }};

复杂度分析:程序只需要遍历完矩阵中的每个点即可得到结果,所以时间复杂度为O(m*n),m*n为矩阵规模。空间复杂度为O(m*n)。

0 0
原创粉丝点击