题目描述
思路
先将问题转化为求最大矩阵的边长
状态表示:dp[i][j]
表示以i,j
为右下角的最大矩阵边长
初始状态:dp[0][0 -> n]
等于matrix[0][0 -> n]
,dp[0->m][0]
等于matrix[0->m][0]
状态转移:dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1
;如下图:
有点类似于木桶短板原理。
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size();
if(m == 0) return 0;
int n = matrix[0].size();
if(n == 0) return 0;
int ans = 0;
int dp[m][n];
memset(dp, 0, sizeof(dp));
// 初始化列
for(int i = 0; i < n; i++)
{
dp[0][i] = matrix[0][i] - '0';
ans = max(dp[0][i], ans);
}
// 初始化行
for(int i = 1; i < m; i++)
{
dp[i][0] = matrix[i][0] - '0';
ans = max(dp[i][0], ans);
}
for(int i = 1; i < m; i++)
{
for(int j = 1; j < n; j++)
{
if(matrix[i][j] == '1')
{
// dp[i][j]为右下角的最大矩阵 = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1])
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
ans = max(ans, dp[i][j]);
}
}
}
return ans * ans;
}
时间复杂度:O(MN)
空间复杂度:O(MN)