题目链接:https://leetcode.com/problems/maximal-square/

题目:

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.

For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0


Return 4.

思路:

用c[i][j]表示在长为i、宽为j的矩阵里面,包含matrix[i][j]这个点的最大正方形的长。

显然c[i][j]的大小跟c[i-1][j]、c[i][j-1]、c[i-1][j-1]有关。画图观察c[i-1][j]、c[i][j-1]、c[i-1][j-1]包围起来的面积

可知 c[i][j] = min(c[i-1][j]、c[i][j-1]、c[i-1][j-1]) +1

算法

public int maximalSquare(char[][] matrix) {  
        if (matrix.length == 0)  
            return 0;  
        int max = 0;  
        int c[][] = new int[matrix.length][matrix[0].length];  
        for (int i = 0; i < matrix.length; i++) {  
            for (int j = 0; j < matrix[0].length; j++) {  
                if (matrix[i][j] == '0') {  
                    continue;  
                }  
                if (i == 0 || j == 0) {// 在边缘时  
                    c[i][j] = 1;  
                } else {  
                    c[i][j] = Math.min(c[i - 1][j - 1], Math.min(c[i - 1][j], c[i][j - 1])) + 1;  
                }  
                max = Math.max(max, c[i][j]);  
            }  
        }  
        return max * max;  
    }