在一个由 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:动态规划法
参考文章
我们定义
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示以
(
i
,
j
)
(i, j)
(i,j)为右下角,且只包含1的正方形的边长最大值。
那么我们如何计算
d
p
dp
dp中元素呢?
- 如果该位置是0,则 d p ( i , j ) = 0 dp(i, j)=0 dp(i,j)=0,因为当前位置不可能在由1组成的正方形中;
- 如果该位置是1,则
d
p
(
i
,
j
)
dp(i,j)
dp(i,j)的值是由其上方、左上、左方中的最小值再加一:
d p ( i , j ) = m i n ( d p ( i − 1 , j ) , d p ( i − 1 , j − 1 ) , d p ( i , j − 1 ) ) + 1 dp(i,j)=min(dp(i-1,j),dp(i-1,j-1),dp(i,j-1))+1 dp(i,j)=min(dp(i−1,j),dp(i−1,j−1),dp(i,j−1))+1
举例
//matrix //dp矩阵
0 1 1 1 0 0 1 1 1 0
1 1 1 1 0 1 1 2 2 0
0 1 1 1 1 0 1 2 3 1
0 1 1 1 1 0 1 2 3 2
0 0 1 1 1 0 0 1 2 3
代码
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_val = 0;
for(int i=0; i<m; ++i) {
dp[i][0] = matrix[i][0] - '0';
max_val = max(max_val, dp[i][0]);
}
for(int j=0; j<n; ++j) {
dp[0][j] = matrix[0][j] - '0';
max_val = max(max_val, dp[0][j]);
}
if(m==1||n==1) return max_val;
for(int i=1; i<m; ++i)
{
for(int j=1; j<n; ++j)
{
if(matrix[i][j]=='1') {
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
max_val = max(max_val, dp[i][j]);
}
}
}
return max_val*max_val;
}
};