一、题目描述:221. 最大正方形(中等)
在一个由 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
动态规划
1、使用一个长度n,m的数组记录当前点的包含1的矩阵边长。使用一个max_num变量记录最大的包含1矩阵长度。
2、动态数组,当matrix[i][j] == '1', dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]) + 1,即左边一层、上一层,左上一层的点的最小包含1的正方形边长加1,当matrix[i][j] == '0', dp[i][j] = 0。如果max_num < dp[i][j] ,则max_num = dp[i][j]
3、边界条件,初始化(i = 0,j,dp[0][j]初始化值 dp[0][j]=maxtrix[0][j] - '0',i ,j = 0,dp[i][0]初始化值 dp[i][0] = maxtrix[i][0] - '0'
三、代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int n = matrix.size();
if(n == 0)
return 0;
int m = matrix[0].size();
if(m == 0)
return 0;
if(m == 1)
return matrix[0][0] - '0';
int max_num = 0;
vector<vector<int>> dp(n,vector<int>(m,0));
for(int i = 0; i < n; i ++)
{
dp[i][0] = matrix[i][0] - '0';
if(max_num < dp[i][0])
max_num = dp[i][0];
}
for(int j = 0; j < m; j ++)
{
dp[0][j] = matrix[0][j] - '0';
if(max_num < dp[0][j])
max_num = dp[0][j];
}
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],dp[i][j-1]);
dp[i][j] = min(dp[i][j],dp[i-1][j-1]);
dp[i][j] += 1;
if(max_num < dp[i][j])
max_num = dp[i][j];
}
else
{
dp[i][j] = 0;
}
}
}
//print(dp);
return max_num * max_num;
}
void print(vector<vector<int>> & dp)
{
for(int i = 0; i< dp.size();i++)
{
for(int j = 0; j< dp[0].size();j++)
{
cout<<dp[i][j]<<",";
}
cout<<endl;
}
cout<<endl<<"*****************"<<endl;
}
};