leetcode 221 Maximal Square(最大正方形)

在一个由0和1组成的二维矩阵内,寻找只包含1的最大正方形,并返回其面积。

例如,给出如下矩阵:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4.

这道题仍然是双重循环遍历二维数组,因为要把所有点都作为左上顶点判断,但是判断的时候可以做一些处理:

  1. 用正方形边长来判断局部是否全1正方形,比如对于坐标[i,j],边长为1时,只需要判断matrix[i,j]==’1’即可,如果是’1’,接下来边长变为2,这时候不是遍历所有4个元素,而是遍历右边加上的一列,以及下边加上的一行是否全1即可。
  2. 一旦扫描新增列或者新增行中有0,那么以此坐标[i,j]作为左上顶点的扫描就可以结束了,此时将[i,j+1]作为左上顶点开始扫描,而这时候有一个可以避免重复扫描的窍门:由于[i,j+1]是[i,j]右移一位,那么当[i,j]时最大边长是len的时候,[i,j+1]时的最小边长肯定至少是len-1了,不需要从边长为1开始重新扫描
public int maximalSquare(char[][] matrix) {
       int max = 0;
        for(int i=0;i<matrix.length;i++){
            int lastLen = 1;
            for(int j=0;j<matrix[0].length;j++){//横向遍历时用上一轮lastlen正方形边长剪枝
                if(matrix[i][j] == '1'){
                    int len = Math.max(lastLen, 2);
                    max = Math.max(max, 1); 
                    while(j+len-1 < matrix[0].length && i+len-1 < matrix.length){//横向纵向都不能越界
                        //判断正方形是否全1
                        boolean allOne = true;
                        for(int row = i;row<i+len;row++){//原有正方形基础上加上最后一列
                            if(matrix[row][j+len-1] == '0'){
                                allOne = false;
                                break;
                            }
                        }
                        if(allOne){//原有正方形基础上加上最后一横排
                            for(int col = j;col<j+len;col++){
                                if(matrix[i+len-1][col] == '0'){
                                    allOne = false;
                                    break;
                                }
                            }
                        }
                        if(allOne){
                            int sum = len*len;
                            max = sum > max? sum : max;
                        }
                        else{
                            break;
                        }
                        len++;
                    }
                    lastLen = len-1;
                }

            }
        }
        return max;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值