在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
思路:动态规划
设dp[i]为最大正方形的右下角。
那么我们该如何去更新dp[i]的值?
因为dp[i]表示正方形的右下角,很显然dp[i]的值与它的左边,左上角,上边的三个值有关系。我们取这三个值中最小的一个并加上dp[i],因为这三个值中,最小的是绝对不会包含0的,而其他的数值,在加上dp[i]的同时,因为有另外两个值的影响,是会包含0的。
如图:
由此得出转移方程:dp[i] = min{ min{dp[i - 1][j], dp[i][j - 1]}, dp[i - 1][j - 1]} + 1;
注意:此方法求出的为最大正方形的边长,最后应返回面积。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int rows = matrix.size();
if( rows == 0 ) return 0;
int rols = matrix[0].size();
int dp[rows + 1][rols + 1];
int l = 0;//边长
memset(dp, 0, sizeof(dp));
for( int i = 1; i <= rows; i++ ) {
for( int j = 1; j <= rols; j++ ) {
if( matrix[i - 1][j - 1] == '1' ) {
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
l = max(l, dp[i][j]);
}
}
}
return l*l;
}
};