正方形最大面积

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

Example:

Input:

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

Output: 4

就是给定一个二维数组 求出他的最大一个正方形的面积 (正方形是由1构成的图形,必须要连续,外加是正方形)

一开始尝试DFS解决(可行) 但是 顶不住 写不出来 后面采用了一个时间复杂度较高但是好理解的算法

先求出正方形最大可能的边长 :int r = matrix.length; 二维数组的行数
int c = matrix[0].length; 二维数组的列数
int len = Math.min(r, c); 最大值是这两个的较小值(因为是正方形)
然后从1开始逐步增加边长的值 判断是否构成的是正方形
判断是否正方形代码如下:

int r = matrix.length; 
        int c = matrix[0].length;
        int len = Math.min(r, c);

总代吗如下:(看代码⑧ 解释太麻烦)

public static int maximalSquare(char[][] matrix) {
    	if(matrix.length == 0) {
    		return 0;
    	}
    	if(matrix.length == 1) {
    		for(int i=0;i<matrix[0].length;i++) {
    			if(matrix[0][i] == '1') {
    				return 1;
    			}
    		}
    	}
    	int max = 0;
        int r = matrix.length; 
        int c = matrix[0].length;
        int len = Math.min(r, c);
        boolean flag = true;
        for(int a=0;a<len;a++) {
        	flag = false;
        	for(int i=0;i+a<r;i++) {
        		if(flag) {
        			break;
        		}
        		for(int j=0;j+a<c;j++) {
        			if(isSquare(matrix,i,j,a)) {
        				max = Math.max(max, (a+1)*(a+1));
        				flag = true;
        				break;
        			}
        		}
        	}
        }
        return max;
    }
    
    public static boolean isSquare(char[][] m,int r,int c,int len) {
    	for(int i=r;i<=r+len;i++) {
    		for(int j=c;j<=c+len;j++) {
    			if(m[i][j] == '0') {
    				return false;
    			}
    		}
    	}
    	return true;
    }
发布了19 篇原创文章 · 获赞 0 · 访问量 300

猜你喜欢

转载自blog.csdn.net/XXuan_/article/details/100524782
今日推荐