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

求最大子矩阵的大小
给定一个整型矩阵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。

解:将其放到一个矩阵中,同时从第0行开始计算,以该行打底时,直方图的最大面积

如第0行,数组为[1, 0, 1, 1] 此时按照下面的求直方图最大面积。

然后以第1行打底,此时数组为[2, 1, 2, 2],同理求直方图最大面积

然后以第2行打底,此时数组为[3, 2, 3, 0]

注:数组的大小是按照它这一行开始,一列中有多少个连续的1来计算的。

类似的题目:给定一个数组,表示的是每个位置的直方图的高度,求直方图中连续部分的最大面积

解:利用单调栈,构成一个有栈底到栈顶是从小到大的结构,当要入栈的元素num小于栈顶元素时,栈顶元素出栈,同时对该元素左右能到达的边界进行记录,这样以这个元素为中心的面积就可以求出来了。

原文地址:https://www.cnblogs.com/SkyeAngel/p/8987860.html

时间: 2024-11-03 21:25:26

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

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

求最大子矩阵的大小 给定一个整型矩阵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

[数据结构]单调栈的基本应用2

[数据结构]单调栈的基本应用2 一.前言 单调栈的基本应用2是单调栈的基本应用1的延伸.应用2主要解决的是二维平面的一些问题. 二.基本应用2 虽然已经应用到二维平面,但是单调栈的思想并没有变化 更多应用的是延伸的位置.本质是ai的左/右第一个大于ai的元素位置 下面列举的一些平面内单调栈的例题: 例1: POJ2559 最大矩形面积 题目描述: 给定n个依次排列并且面积为1*hi的矩形,现求这个图形所包含最大的矩形的面积. 上图中7个矩形的h依次为2 1 4 5 1 3 3.注意题目有多组数据

数据结构--单调栈--烽火台

京东笔试编程题:烽火台,动态规划解法| Hexo https://www.nowcoder.com/discuss/8704?type=0&order=0&pos=5&page=0 战争游戏的至关重要环节就要到来了,这次的结果将决定王国的生死存亡,小B负责首都的防卫工作.首都处于一个四面环山的盆地中,周围的n个小山构成一个环,作为预警措施,小B计划在每个小山上设置一个观察哨,日夜不停的瞭望周围发生的情况. 一旦发生外敌入侵事件,山顶上的岗哨将点燃烽烟.若两个岗哨所在的山峰之间没有更

数据结构——单调栈&单调队列(解决滑动窗口问题)

单调队列解答: /*******************单调队列!=优先队列单调队列是为了保证队列内的元素具有单调性,在保持了元素原本顺序的同时,对元素进行了过滤,舍弃了会影响单调性的元素而优先队列本质上还是个队列不会舍弃任何元素,每个元素都在队列之中,但是在队列中的位置由优先队列定义的优先级来确定,损失了原数组中的数据相对位置关系.所以很显然,单调队列是解决:寻找在某元素左侧区间或者右侧区间的最值问题,而优先队列的应用是寻找整个区间内的最高优先级别的内容./******************

数据结构--单调栈结构

解决的问题:在一个数组中,每一个位置的num,找到左边离num近的>num的值,和右边离num近的>num的值 时间复杂度:O(N) 准备一个栈:栈底到栈顶  从大到小 遍历数组,将数组中的元素num依次入栈,同时保证栈中的元素比num大,如果num大于栈中的元素,则将栈中的元素弹出,同时记录弹出元素的结果,num就是弹出元素右边离它近的大于它的,栈中它挨着的元素就是左边离它近的大于它的元素. 一直出栈,直到栈中元素大于将要入栈的元素,或者栈为空停止 当数组遍历完后,栈中的元素依次弹出,此时它

ACM数据结构-单调栈、队列

1.最大数 代码: #include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define

poj1924(单调栈求最大矩阵)

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1000+10; bool tu[maxn][maxn]; int h[maxn][maxn],l[maxn],r[maxn]; int main(){ int n,k,m; char c[10]; scanf("%d",&k); while(k--){ mems

51nod 1215 数组的宽度&amp;poj 2796 Feel Good(单调栈)

单调栈求每个数在哪些区间是最值的经典操作. 把数一个一个丢进单调栈,弹出的时候[st[top-1]+1,i-1]这段区间就是弹出的数为最值的区间. poj2796 弹出的时候更新答案即可 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<cmath

【bzoj3956】Count 单调栈+可持久化线段树

题目描述 输入 输出 样例输入 3 2 0 2 1 2 1 1 1 3 样例输出 0 3 题解 单调栈+可持久化线段树 本题是 bzoj4826 的弱化版(我为什么做题总喜欢先挑难的做QAQ) $k$对点对$(i,j)$有贡献,当且仅当$a_k=max(a_{i+1},a_{i+2},...,a_{r-1})$,且$a_k<a_i\&\&a_k<a_j$. 那么我们可以使用单调栈求出i左面第一个比它大的位置$lp[i]$,和右面第一个比它大的位置$rp[i]$,那么点对$(lp