欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode-221. Maximal Square 最大正方形

程序员文章站 2022-04-02 22:09:14
...

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

Example:

Input: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Output: 4

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

示例:

输入: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

 

思路:

方法一:还是延续 最大矩形 这个题目的思路。把每一行看做一个直方图的底部。做一次 柱状图中最大矩形 。

方法二:DP,首先,二维dp[i][j] 数组表示到第i行第j列所能组成的最大正方形的边长。先考虑边界情况,也就是i=0或j=0时,那能组成的最大正方形肯定只有1,所以只需要判断i=0或者j=0时的元素值是否为1即可。然后对于任意一点[i][j],当数据元素为1时,只需要考虑上面[i-1][j],左边[i][j-1],左上角[i-1][j-1]中最小的值的边长再加1,也就是说当前最大的。然后找出最大的dp[i][j]即可。

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return 0;
        int m=matrix.size(),n=matrix[0].size(),res=0;
        vector<vector<int> > v(m,vector<int>(n,0));
        for(int i=0;i<m;++i)
        {
            for(int j=0;j<n;++j)
            {
                if(i==0 || j==0) v[i][j]=matrix[i][j]-'0';
                else if(matrix[i][j]=='1')
                {
                    v[i][j]=min(v[i-1][j-1],min(v[i-1][j],v[i][j-1]))+1;
                }
                res=max(res,v[i][j]);
            }
        }
        return res*res;
    }
};