221. Maximal Square

来源:互联网 发布:宝宝学画画软件 编辑:程序博客网 时间:2024/05/24 15:41

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

For example, given the following matrix:

1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
Return 4.

思路,遍历每一个1,然后向右向下扩展,看看能否构成正方形

public class MaximalSquare {    // 判断是否是正方形    public boolean ifSquare(int i, int j, int k, char[][] matrix) {        for(int a = j; a <= j + k; a++) {            if(matrix[i+k][a] != '1') return false;        }        for(int a = i; a <= i + k; a++) {            if(matrix[a][j+k] != '1') return false;        }        return true;    }    // 计算正方形的最大面积    public int getArea(int i, int j, char[][] matrix) {        int k = 1;        while((i + k < matrix.length) &&             (j + k < matrix[0].length) &&             ifSquare(i, j, k, matrix)) {            k++;        }        return k * k;    }    public int maximalSquare(char[][] matrix) {        int area = 0;        if(matrix[0].length == 0) return area;        int minLength = Math.min(matrix.length, matrix[0].length);        int maxArea = minLength * minLength;        for(int i = 0; i < matrix.length - 1; i++) {            for(int j = 0; j < matrix[0].length - 1; j++) {                if(matrix[i][j] == '1') {                    area = Math.max(area, getArea(i, j, matrix));                    if(area == maxArea) return area;                }            }        }        if(area == 0) {            for(int i = 0; i < matrix[0].length; i++) {                if(matrix[matrix.length-1][i] == '1') return 1;            }            for(int i = 0; i < matrix.length; i++) {                if(matrix[i][matrix[0].length-1] == '1') return 1;            }        }        return area;    }    public static void main(String[] args) {        // TODO Auto-generated method stub        MaximalSquare ms = new MaximalSquare();        char[][] matrix = {                {'1','0','1','0','0'},                {'1','0','0','1','1'},                {'1','1','0','1','1'},                {'1','0','1','1','1'}        };        int area = ms.maximalSquare(matrix);        System.out.println(area);    }}

这里写图片描述

然后看了讨论区,好吧我SB,大神们用的DP,几行搞定

    public int maximalSquareDp(char[][] matrix) {        if(matrix.length == 0 || matrix[0].length == 0) return 0;        int[][] dp = new int[matrix.length + 1][matrix[0].length + 1];        int max = 0;        for(int i = 1; i <= matrix.length; i++) {            for(int j = 1; j <= matrix[0].length; j++) {                if(matrix[i-1][j-1] == '1') {                    dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;                    max = Math.max(max, dp[i][j]);                }            }        }        return max * max;    }

不过程序运行时间,就有点。。。
这里写图片描述

原创粉丝点击