题目描述:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-square
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix)
{
int n = matrix.size();
if(n == 0)
return 0;
int m = matrix[0].size();
vector<vector<int>> dp(n,vector<int>(m,0));
int maxlen = 0;
for(int i=0;i<n;++i)
{
if(matrix[i][0] == '1')
{
maxlen = 1;
dp[i][0] = 1;
}
}
for(int i=0;i<m;++i)
{
if(matrix[0][i] == '1')
{
maxlen = 1;
dp[0][i] = 1;
}
}
for(int i=1;i<n;++i)
{
for(int j = 1;j<m;++j)
{
if(matrix[i][j] == '1')
{
dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;
maxlen = max(dp[i][j],maxlen);
}
}
}
return maxlen*maxlen;
}
};
解题思路:
dp[i][j] 代表的含义是i,j左上方可以组成的正方形的最大边长;
dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;
如果某个位置是1,那么它左上的最大边就是它左边,上边,左上边的最大边长的最小值加1,每次都要更新maxlen的值。