Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
For example, given the following matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
For example, given the following matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 4.
一开始想用贪心,但是总觉得想的不太顺,后来用DP。
每个点的dp值为以该点为右下角做能构成的矩阵最大值。这里的最大值不是面积而是边长。
需要注意的是第一遍敲的时候,第一,忘记先把两个边界填充好,第二,忘记在填充边界的时候更新maxs,第三,忘记填充过后的循环应该从1开始,第四,忘记返回的是maxs的平方。
少年仍需努力啊。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(!matrix.size()) return 0;
vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size(), 0));
int maxs = 0;
for(int i = 0; i < matrix.size(); ++i) {dp[i][0] = matrix[i][0]-'0'; maxs = max(maxs, dp[i][0]);}
for(int j = 0; j < matrix[0].size(); ++j) {dp[0][j] = matrix[0][j]-'0'; maxs = max(maxs, dp[0][j]);}
for(int i = 1; i < dp.size(); ++i)
for(int j = 1; j < dp[0].size(); ++j){
if(matrix[i][j]-'0' == 1){
if(dp[i-1][j-1]&&dp[i-1][j]&&dp[i][j-1]) {
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))+1;
maxs = max(maxs, dp[i][j]);
}
else dp[i][j] = 1;
}
}
return maxs*maxs;
}
};