最大正方形

在一个由 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 一般都可以压缩为一维的

原文地址:https://www.cnblogs.com/tobemaster/p/12398706.html