在一个由 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
画一个图推一推。
dp数组的定义:前i行前j列,全为1的正方形最大的边长。
初始化:dp[0][j] = 0,dp[i][0]=0
状态转移:min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1,只讨论元素为1的位置。
还需要处理一下:
1 0
0 0
这样的情况如果之前出现边大于0的正方形,而这一步使dp[i][j] = 0,那么结果可能就不正确,所以要用一个ans全局变量,记录全局的最长边。
class Solution {
public int maximalSquare(char[][] matrix) {
int rols = matrix.length;
if(rols == 0) return 0;
int cows = matrix[0].length;
int[][] dp = new int[rols+1][cows+1];
int ans = 0;
for(int i = 1; i <= rols; i++) {
for(int j = 1; j <= cows; j++) {
if(matrix[i-1][j-1] == '1') {
dp[i][j] = Math.min(dp[i][j-1],Math.min(dp[i-1][j-1], dp[i-1][j])) + 1;
ans = Math.max(ans, dp[i][j]);
}
}
}
return ans*ans;
}
}