leecode-最大矩形

题目描述

在这里插入图片描述
在这里插入图片描述

思路

暴力解法

遍历所有点,找到以这个点为右下角的最大矩阵面积。
输入数组:char[][] matrix(注意这里是char类型)
辅助数组:left[][] 每个点左侧连续1的数目(包括这个点本身)
目标数组:area[i][j]=//area[i][j] 为以maxtrix[i][j]为矩阵右下角的最大矩阵面积

求得目标数组的方法:
(1)首先找到以这个点为右下角的 高为1的 矩阵,也就是left[i][j]的值
(2)向上走一步,选择这两个点left[i][j] 小的作为宽,计算高为2的面积,如果比高为1时的矩阵面积大,那么就记录下来
(3)重复第二步,直到矩阵的最上面,注意矩阵宽的选择
时间复杂度:O(m²n)

代码

class Solution {
    public int maximalRectangle(char[][] matrix) {
        //暴力解法:遍历每一个点,求出以该点为右下角的最大矩阵面积
        //首先找出每一个点左边连续1的数量
        if(matrix.length == 0) return 0;
        int[][] left = new int[matrix.length][matrix[0].length];

        for(int i=0;i<left.length;i++){//逐行计算
            int start = 0;
            for(int j=0;j<left[0].length;j++){
                if(matrix[i][j] == '1'){
                    left[i][j] = ++ start;
                }else{
                    left[i][j] = 0;
                    start = 0;
                }
            }
        }
        // showMatrix(left);
        //area[i][j] 为以maxtrix[i][j]为矩阵右下角的最大矩阵面积
        int[][] area = new int[matrix.length][matrix[0].length];

        //下面的工作就是填充这个矩阵
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
                int height = 1;
                int width = left[i][j];//第一行矩阵的长度,即为这个点左侧连续1的个数(包括这个点本身)
                int eachMaxArea = width;
                if(width != 0){//这个点不为0
                    for(int k=i-1;k>=0;k--){
                        height ++;
                        if(left[k][j] == 0)    break;
                        if(left[k][j] < width)  width = left[k][j];
                        if(eachMaxArea < (width * height)){
                            eachMaxArea = width*height;
                        }
                    }
                    area[i][j] = eachMaxArea;
                }
            }
        }
        // showMatrix(area);

        int maxArea = 0;
        for(int i=0;i<area.length;i++){
            for(int j=0;j<area[0].length;j++){
                if(maxArea < area[i][j])    maxArea = area[i][j];
            }
        }

        return maxArea;
    }

    private void showMatrix(int[][] matrix){
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值