Maximal Square
24% Accepted
Given a 2D binary matrix filled with 0's and 1's,
find the largest square containing all 1's and return its area.
Have you met this question in a real interview? Yes
Example
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.
Tags Expand
- Dynamic Programming
思路
- 画图自己找的规律
矩阵图
a=16 b=25
[0,1,1,1,1,1,1,1,1,1]
[1,0,1,1,1,1,1,1,1,1]
[1,1,0,1,1,1,1,1,1,1]
[1,1,1,0,1,1,1,1,1,1]
[1,1,1,1,0,1,1,1,1,1]
[1,1,1,1,1,0,1,1,1,1]
[1,1,1,1,1,1,0,1,1,1]
[1,1,1,1,1,1,1,0,1,1]
[1,1,1,1,1,1,1,1,0,1]
[1,1,1,1,1,1,1,1,1,0]
[0,1,1,1,1,1,1,1,1,1]
[1,0,1,4,4,4,4,4,4,4]
[1,1,0,1,4,9,9,9,9,9]
[1,4,1,0,1,4,9,a,a,a]
[1,4,4,1,0,1,4,9,a,b]
[1,4,9,4,1,0,1,4,9,a]
[1,4,1,1,1,1,0,1,1,1]
[1,1,1,1,1,1,1,0,1,1]
[1,1,1,1,1,1,1,1,0,1]
[1,1,1,1,1,1,1,1,1,0]
public class Solution {
    public int maxSquare(int[][] matrix) {
        if (matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] area = new int[m][n];
        int maxArea = 0;
        for (int i = 0; i < m; i++) {
            area[i][0] = matrix[i][0];
            maxArea = Math.max(maxArea,area[i][0]);
        }
        for (int j = 0; j < n; j++) {
            area[0][j] = matrix[0][j];
            maxArea = Math.max(maxArea,area[0][j]);
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i-1][j-1] == 1 && matrix[i-1][j] == 1 && matrix[i][j-1] == 1 && matrix[i][j] == 1) {
                    int min = Math.min(Math.min(area[i-1][j-1], area[i-1][j]), area[i][j-1]);
                    Double big = (int)(Math.sqrt(min) + 1) * (Math.sqrt(min) + 1);
                    area[i][j] = big.intValue();
                    maxArea = Math.max(maxArea,area[i][j]);
                } else {
                    area[i][j] = matrix[i][j];
                }
            }
        }
        return maxArea;
    }
}