最大正方形
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4
class Solution { public int maximalSquare(char[][] arr) { int len = arr.length; if (len == 0) { return 0; } int inner_len = arr[0].length; int [] dp = new int[inner_len + 1]; int pre = 0; int max = 0; for (int i = 0; i < len; i++) { for (int j = 0; j < inner_len; j++) { int temp = dp[j + 1]; if (arr[i][j] == '0') { dp[j + 1] = 0; } else { dp[j + 1] = Math.min(dp[j], Math.min(dp[j + 1], pre)) + 1; } max = Math.max(max, dp[j + 1]); pre = temp; } } return max * max; } }
入上图所示,当我们想求位置4(记做i,j位置)为右下角时,正方形的最大边长,记做dp[i][j]
我们可以先不考虑正方形,只考虑长方形(最后取较短边即可)
那么以n为右下角的时候,dp[i][j]向上延伸的最大程度为 xd(dp[i-1][j])和oa(dp[i-1][j-1])的较小值, 向左延伸的最大程度为ob(dp[i-1][j-1])和yf(dp[i][j-1])的较小值
那么dp[i][j]向上延伸和向左延伸的较小值则为最大正方形边长min( min(dp[i-1][j], dp[i-1][j-1]), min(dp[i-1][j-1], dp[i][j-1])) 最后要考虑右下角这个位置的边长为1,
那么当[i, j]位置为1 的时候,dp[i][j] = min(min(dp[i-1][j], dp[i-1][j-1]),dp[i][j-1]) + 1;
那么当[i, j]位置为0 的时候,dp[i][j] = 0;
二维dp 一般都可以压缩为一维的