求最大子矩阵的大小(单调栈的应用)

给定一个只包含0和1的矩阵,找到其中全为1的最大子矩阵的大小。通过以每一行为基底,计算每行中1的最大连续数量,再结合单调栈寻找左右扩展边界,从而得到最大矩形面积。时间复杂度为O(M*N)。
摘要由CSDN通过智能技术生成

求最大子矩阵的大小

题目

给定一整型矩阵,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大矩形区域为1的数量。

例如
 1 1 1 0
 其中最大的矩形区域有31,所以返回3.
 1 0 1 1 
 1 1 1 1 
 1 1 1 0
 最大的矩形区域有61,所以返回6.

解答

矩阵大小为O(N* M),可以进行到时间复杂度为O(M* N)
求解思路:

  • 以每一行进行切割。

    1.切割,统计以当前行作为底的情况下,每个位置上1的数量。
    2.用height数组进行存储。

  • 求解每行的最大矩形的面积。
    把每一行看作是矩形柱,然后将其向左向右进行扩展,扩展的原则就是:只能够柱子高度低的向柱子高度高的方向扩展,如果左侧不存在就不能够进行扩展。矩形的面积就是矩形柱子的高度乘以其对对应的可扩展的宽度。

  • 在进行考察柱子最大能够扩多大?问题的本质就是找柱子左边离它最近且比它小的柱子的位置在哪里,以及右侧离它最近且比它小的柱子位置在哪里。解决这个问题利用单调栈可以快速进行求解。单调栈结构及应用

代码

import java.util.Stack;

public class Code_03_maxRectangle {
   
    public static int maxRecSize(int[][] map){
   
        if (map == null || map.length == 0 || map[0].length == 0){
   
            return 0;
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值