問題描述:
在一個由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;
}
};