问题描述:
在一个由0和1组成的二维矩阵中,找到只包含1的最大正方形,并返回其面积。
问题分析:
这是一道典型的数学类的题目。需要明确一点是考察动态规划方面的知识。
【1】我们用o来初始化另一个矩阵dp,而且维数和原数组相同;
【2】dp数组中的每个元素表示由1组成的最大正方形的边长,如dp[i][j] = 2,表示到(i,j)这个位置,可以组成最长正方形的边为2;
【3】从初始位置开始,遍历原始矩阵,当遇到0,则dp[i][j] = 0, 如果遇到1,则用下面动态方程来进行值更新:
【4】我们最后用一个变量来记录这个dp矩阵中最大的元素(边长),然后进行平方,即为该正方形的面积。
class Solution{
public:
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;
vector<vector<int>> dp(m,vector<int>(n,0));
int max_num = 0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(i==0||j==0) dp[i][j]=matrix[i][j]-'0';
else
{
if(matrix[i][j]=='1')
{
dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
}
else dp[i][j]=0;
}
max_num=max(max_num,dp[i][j]);
}
}
return max_num*max_num;
}
};