1. 题目
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
2. 代码
- vector<vector> dp(m+1, vector(n+1, 0)); 定义二维vector以及其初始化!!!
- 当测试用例是 [] 的时候,只有row的值, 没有col的值
- min 和 max只有两个参数,第三个参数如果有的话为operation。 所以我们采用的是
min(dp[i-1][j], min(dp[i-1][j-1], dp[i][j-1])) 嵌套min
- 我们了解到最大的正方形应该是从
- DP[i][j]来记录以点i,j为右下角的全1矩阵的最大边长。 即DP[i][j]表示的是边长大小!!!
- dp[i][j] = min(dp[i-1][j], min(dp[i-1][j-1], dp[i][j-1])) + 1;
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/054a304d5a200cf04cf282dbc01ce4f9.png)
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size();
if(m==0) return 0; //防止测试用例是 [], 这个时候,只有所谓的行m, 不存在n。
int n = matrix[0].size();
int maxSqr = 0;
vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
if(matrix[i-1][j-1] == '1') { //只有当其左上角是1的时候才执行下面的操作
dp[i][j] = min(dp[i-1][j], min(dp[i-1][j-1], dp[i][j-1])) + 1;
maxSqr = max(dp[i][j], maxSqr);
}
}
}
return maxSqr * maxSqr;
}
};