leetcode——Maximal Rectangle

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

首先,对于每一行,从第一个元素依次遍历,若当前元素为1,则记录包括当前元素开始向前有多少个连续的1的个数;若为0,则记录为0。

其次,按列遍历。对于每一个非0 的记录,从当前这点开始,向上与向下各扫描一次,直到遇到记录小于当前记录的时候停止。同时统计扫描的行数(记为count,初始算作自己为1,count最终为扫描的行数总和,不算小于该记录的行数)。

则针对当前位置所在的最大矩形即为 当前记录*count。

记录下每次得到的矩形,得到最大值。

分析如图:


图1:原始矩阵                

              

图2:记录矩阵


图3:对于2来说,向上2行,向下1行,自己1行,count=4,

因此自己所处位置为终点的矩形面积为8.


遍历之后得到的面积就是最大的面积。

注意:1、在某一点得到的面积,并不是该点所在的最大矩形面积。只能是以该点所在的列为最右一条边的矩形面积。

           2、若想得到最大的那个矩形矩阵,则在每次比较max的时候进行记录就好。

AC代码:

public class Solution {
    public int maximalRectangle(char[][] matrix) {
        if(matrix.length == 0)
            return 0;
        int max = 0;
        int m = matrix.length;
        int n = matrix[m-1].length;

        int[][] metrix = new int[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(j==0){
                    if(matrix[i][j]=='1'){
                        metrix[i][j]= 1;
                    }
                    else
                        metrix[i][j] = 0;
                }
                else{
                    if(matrix[i][j]=='0')
                        metrix[i][j]=0;
                    else{
                        metrix[i][j] = metrix[i][j-1]+1;
                    }
                }
            }
        }

        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(metrix[i][j]==0)
                    continue;
                int count = 1;
                for(int k = i-1;k>=0 && metrix[k][j]>=metrix[i][j];k--,count++);
                for(int k = i+1;k<m && metrix[k][j]>=metrix[i][j];k++,count++);

                if(max<metrix[i][j] * count){
                    max = metrix[i][j] * count;
                }
            }
        }
        return max;
    }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值