栈和队列----求最大子矩阵的大小

求最大子矩阵的大小

  

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

  例如: 1  1  1  0,其中最大的矩形区域有3个1,所以返回3

  例如:

  1  0  1  1

1  1  1  1

  1  1  1  0

  其中,最大的矩形区域有6个1,所以返回6

  

  【解析】

  首先,矩阵的行数为N,以每一行作为分割,统计以当前行作为底的情况下,每个位置往上的1 的数量,使用高度数组 height 来表示。

  其次,对于每一次分割,都利用更新后的height数组来求出每一行为底的情况下,最大的矩形的大小。这一步的实质就是在直方图中求最大矩形的面积,找到柱子左边刚比它小的柱子位置,以及右边刚比它大的柱子位置,用栈计算最快。

  

package com.test;

import java.util.Stack;

/**
 * Created by Demrystv.
 */
public class MaxSubRecSize {

    //height数组表示在以当前行作为底的情况下,每个位置往上的连续的 1 的数量
    public int maxRecSize(int[][] map){
        if (map==null || map.length==0 || map[0].length==0){
            return 0;
        }
        int maxArea = 0;
        int[] height = new int[map[0].length];
        for (int i=0; i<map.length; i++){
            for (int j=0; j<map[0].length; j++){
                height[j] = map[i][j]==0 ? 0 : height[j] + 1;
            }
            maxArea = Math.max(maxRecFromBottom(height), maxArea);
        }
        return maxArea;
    }

    //找到柱子左边刚比它小的柱子位置,以及右边刚比它大的柱子位置,用栈计算最快
    private int maxRecFromBottom(int[] height){
        if (height==null || height.length==0){
            return 0;
        }
        int maxArea = 0;
        Stack<Integer> stack = new Stack<Integer>();
        for (int i=0; i<height.length; i++){
            while (!stack.isEmpty() && height[i]<=height[stack.peek()]){
                int j = stack.pop();//不断循环,直到当前位置的值大于栈顶元素
                int k = stack.isEmpty() ? -1 : stack.peek();
                int curArea = (i - k + 1) * height[j];
                maxArea = Math.max(curArea, maxArea);
            }
            stack.push(i);
        }
     // 针对的是从栈底到栈顶一直递增的情况
        while (!stack.isEmpty()){
            int j = stack.pop();
            int k = stack.isEmpty() ? -1 : stack.peek();
            int curArea = (height.length - k + 1) * height[j];
            maxArea = Math.max(curArea, maxArea);
        }
        return maxArea;
    }
}

原文地址:https://www.cnblogs.com/Demrystv/p/9302347.html

时间: 2024-10-29 12:00:03

栈和队列----求最大子矩阵的大小的相关文章

数据结构--单调栈--求最大子矩阵的大小

求最大子矩阵的大小给定一个整型矩阵map, 其中的值只有0和1两种, 求其中全是1的所有矩形区域中, 最大的矩形区域为1的数量.例如:1 1 1 0其中, 最大的矩形区域有3个1, 所以返回3.再如:1 0 1 11 1 1 11 1 1 0其中, 最大的矩形区域有6个1, 所以返回6. 解:将其放到一个矩阵中,同时从第0行开始计算,以该行打底时,直方图的最大面积 如第0行,数组为[1, 0, 1, 1] 此时按照下面的求直方图最大面积. 然后以第1行打底,此时数组为[2, 1, 2, 2],同

3-5-表达式求值-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 表达式求值 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据

求表达式的值--栈和队列的应用

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_SIZE 20 7 #define STACK_INCREMENT 10 8 #define QUEUE_SIZE 20 9 10 typedef int Status; 11 12 typedef char StackElemtype; 13 typedef struct Stack{ 14 Sta

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

用数组结构实现大小固定的栈和队列

给定长度为size的数组,将其长度设置为大小为size的栈(队列),添加的数字如果超过了既定的长度就报错! 先实现栈(先进后出): 后实现队列(先进先出): 代码如下: 1 //例子:长度为6的数组,设置大小为6的栈,超过长度就会报错 2 //用数组结构实现大小固定的队列和栈 3 public class Bokeyuan { 4 //使用数组实现栈 5 public static class ArrayStack{ 6 private Integer[] arr;//数组 7 private

数据结构和算法分析(9)表栈和队列的实际应用(一)

    在接下来的几篇博文中,将介绍表.栈.队列在编程实践中的应用.     (1)表达式求值:     输入一个中缀表达式,操作符包括(+ - * / ^).转化为后缀表达式之后并计算表达式的值: 要求: 1.输入的中缀表达式必须是一个完整的字符串: 2.不限制数字的位数和正负,负数用()括起来: 代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define EmptyT

栈、队列、堆

新年伊始 再破一谜团 区别参考: 队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间.即动态分配内存,对其访问和对一般内存的访问没有区别. {堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出).} 栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方. 对于堆,我们可以随心所欲的进行增加变量和删除变量

小猪的数据结构辅助教程——3.1 栈与队列中的顺序栈

小猪的数据结构辅助教程--3.1 栈与队列中的顺序栈 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点 1.栈与队列的介绍,栈顶,栈底,入栈,出栈的概念 2.熟悉顺序栈的特点以及存储结构 3.掌握顺序栈的基本操作的实现逻辑 4.掌握顺序栈的经典例子:进制变换的实现逻辑 1.栈与队列的概念: 嗯,本节要进行讲解的就是栈 + 顺序结构 = 顺序栈! 可能大家对栈的概念还是很模糊,我们找个常见的东西来拟物化~ 不知道大家喜欢吃零食不--"桶装薯片"就可以用来演示栈! 生产的时

浅谈算法和数据结构(1):栈和队列

浅谈算法和数据结构(1):栈和队列 2014/11/03 ·  IT技术                                         · 2 评论                                      ·  数据结构, 栈, 算法, 队列 分享到: 60 SegmentFault D-Day 2015 北京:iOS 站 JDBC之“对岸的女孩走过来” CSS深入理解之relative HTML5+CSS3实现春节贺卡 原文出处: 寒江独钓   欢迎分享原创