您好、欢迎来到现金彩票网!
当前位置:2019全年免费资料大全 > 桶链算法 >

【搞定算法】单调栈问题:直方图中的最大矩形面积、求最大子矩阵

发布时间:2019-08-16 05:13 来源:未知 编辑:admin

  1、新元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除,直到栈为空或者栈满足单调性才能加入新元素;

  2、单调栈是 O(N) 级的时间复杂度,所有元素只会进入栈一次,并且出栈后再也不会进栈;

  3、单调栈可以找到元素向左遍历第一个比它小(大)的元素,也就是说在元素进栈前它向左拓展的区间已经确定,在出栈前它能向右拓展的区间也能确定(左区间好理解,仔细体会右区间的确定,若该元素至遍历结束后也未出栈,那么就是说在原数组中,该元素的右方向没有一个元素可以比它大/小,那么该元素的右边界就是原数组的大小(就是没有右边界),否则它的右边界就是令它出栈的元素)。

  有重复元素时,只需要在每个位置拉一个链表出来就行了。每次插入元素都是插入到链表的尾部,这样任一元素左边比它小的最近的元素就是栈中左边位置链表的尾元素。

  问题:直方图是由排列在同一基线上的一系列矩形组成的多边形。为了简单起见,假设这些矩形的宽度相等但高度可能不同。例如,下图1给出了一个直方图,其中各个矩形的高度为3、2、5、6、1、4、4,宽度为标准1单位。当给定了一个保存所有矩形高度的数组时,如何找到其中最大的矩形。

  考虑必须包含某个柱子的矩形的最大面积,那么我们就需要找到这个柱子往左和往右的边界,这样宽度高度都有了,就有了必须包含这个柱子的最大面积,左右柱子的这个最大面积求出来,这其中的最大即为全局最大。

  1、使用一个stack,首先压入第一个元素的位置,然后遍历数组,在遇到当前数组大于栈顶对应值时,直接入栈即可,否则进行出栈操作,直到栈顶元素的值小于当前元素。然后压入当前元素。这一过程中即可求出必须包含栈顶元素的最大矩阵面积。

  假设现在遍历到 i,如果栈顶元素小于 heights[i],表明这个 i 就是栈顶元素的左边界,而栈顶元素的右边界就是栈顶元素的下边一个元素(为空补 -1),这样就可以求得必须包含栈顶元素的最大矩形面积。这样遍历一次之后就所有的情况都考虑到了。需要注意的是你遍历结束之后,可能栈中还有元素,也需要把这些元素弹出结算,此时这些元素的右边界即为heights.length。

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

  1、算出必须以第 i 行作为底的情况下的直方图高度是多少【从当前位置出发,往上有多少个连续的 1】

  2、算出该直方图的最大矩形面积:单调栈问题,只是多了个等号,用上面那种 list 来解决重复也可以,只是这种更简单【相等也会让栈弹出,那么以该值为底的最大矩形是让它弹出那个相等的说了算】

  2.如果 A 和 B 是不同的山,并且在环中相邻,认为可以相互看见。比如图1-8 中,相邻的山峰对有(1,2)(2,4)(4,5)(3,5)(1,3)。

  3.如果 A 和 B 是不同的山,并且在环中不相邻,假设两座山高度的最小值为min。如果A通过next 方向到B 的途中没有高度比min 大的山峰,或者 A 通过last 方向到 B 的途中没有高度比 min 大的山峰,认为 A 和 B 可以相互看见。比如图中,高度为 3 的山和高度为 4 的山,两座山的高度最小值为 3。3 从 last 方向走向 4,中途会遇见 5,所以 last 方向走不通;3 从 next 方向走向4,中途会遇见1 和 2,但是都不大于两座山高度的最小值 3,所以 next 方向可以走通。

  有一个能走通就认为可以相互看见。再如,高度为 2 的山和高度 为5 的山,两个方向上都走不通,所以不能相互看见。图中所有在环中不相邻,并且能看见的山峰对有(2,3)、(3,4)。给定一个不含有负数且没有重复值的数组 arr,请返回有多少对山峰能够相互看见。

  进阶问题:给定一个不含有负数但可能含有重复值的数组 arr,返回有多少对山峰能够相互看见。

  如果 arr 长度为N,没有重复值的情况下时间复杂度达到 O(1),可能有重复值的情况下时间复杂度请达到 O(N)。

  原问题:时间复杂度 O(1) 的解。如果数组中所有的数字都不一样,可见山峰对的数量可以由简单公式得到。环形结构中只有1 座山峰时,可见山峰对的数量为 0;环形结构中只有2 座山峰时,可见山峰对的数量为1。这都是显而易见的。环形结构中有 i 座山峰时(i 2),可见山峰对的数量为 2 × i - 3。下面给出证明。

  我们只用高度小的山峰去找高度大的山峰,而永远不用高度大的山峰去找高度小的山峰【精髓】。比如题目描述中的例子,从 2 出发按照“小找大”原则,会找到 (2,3) 和 (2,4),但是不去尝试2能不能看到 1,因为这是“大找小”,而不是“小找大”。(1,2) 这一对可见山峰不会错过,因为从 1 出发按照“小找大”原则找的时候会找到这一对。从每一个位置出发,都按照“小找大”原则找到山峰对的数量,就是总的可见山峰对数量。

  环形结构中只有 1 座山峰时,可见山峰对的数量为0;环形结构中只有2座山峰时,可见山峰对的数量为 1。这都是显而易见易见的。

  因为 i 座山峰高度不一样,必然在环中存在唯一的最大值和唯一的次大值(第二大的值)。x 是除了最高值和次高值之外的任何一座山峰,所以 x 在 last 方向上必存在第一个高度比它大的节点,x 在 next 方向上也必存在第一个高度比它大的节点,所以从 x出发能找到且只能找到 2 对。

  除了最大值和次大值之外还剩 i - 2 个节点,这 i - 2 个节点每一个都能找到 2 对,所以一共有(i - 2) *2 对,还有 1 对,就是次大值能够看见最大值这对。所以一共是 2i - 3 对。

  1、首先遍历一次环形山结构,找到最大值的位置,如果最大值不只一个,找哪一个最大值都行。准备一个栈,栈中放 stack,Record 包含元素及元素目前重复了多少个;

  2、求一个数左边(逆时针方向)离它最近的比它大的数,右边(顺时针)离它最近的比它大的数,然后他们就能和该数组成可见山峰对。栈中按从栈底到栈顶由大到小的顺序放入,不满足就弹出栈顶元素,说明找到了栈顶元素的可见山峰,然后计算可见山峰对;

  求图片中矩形最大的面积,类似于桶的容量由最短的木板决定的,见图片。  矩形的高度可以用数组表示,同时这个场景可以和另外一个场景联系起来:给定一个二维矩阵,矩阵中的元素只有0和1,求一个最大的子矩阵(要...博文来自:liurong_scut的博客

  直方图最大面积时间限制:1sec空间限制:256MB问题描述有一个直方图,横轴长度为n,第i列的高度为h[i]。请你求出在这个直方图中面积最大的子矩阵。输入格式第一行一个正整数n。第二行n个用空格隔开...博文来自:的博客

  单调栈,顾名思义就是说栈内的元素,按照某种方式排序下,必须是单调的。如果新入栈的元素破坏了单调性,就弹出栈内元素,直到满足单调性。它可以很方便地求出某个数的左边或者右边第一个比它大或者小的元素,而且总...博文来自:say_haha的博客

  1、使用暴力算法枚举所有的端点计算其最小值,复杂度为O(n2)O(n2)O(n^2)2、观察特点,很多区间的左边和右边其实还可以拓展,产生更大的面积3、拓展的边界就是第一个小于这个原始区间中最小的那个...博文来自:ProJ7-Jeffy

  目录》题目《》思路《》代码《》题目《在X轴上水平放置着N个条形图,这N个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。例如下图,图1...博文来自:zyz_bz的博客

  求最大子矩阵的大小(题目)给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。例如:1110其中,最大的矩形区域有3个1,所以返回3。再如:1011...博文来自:Amber的博客

  题目链接题目给一个向量,里面存一个序列,表示一个直方图的各个元素高,要求出这个直方图中的最大矩形面积;构建一个递增的单调栈:[单调栈就是一个栈,栈底元素向栈头元素递增,新加入的元素如果小于栈顶元素,就...博文来自:的博客

  单调队列和单调栈很相似,他们是什么区别呢?首先引用的话:单调栈解决的是以某个值为最小(最大)值的...博文来自:roufoo的博客

  题目题目传送门题目传送门题目传送门题解如果矩形的高度从左向右单调递增,那么我们可以枚举每个矩形的高度,并把宽度延伸到左右边界,来计算面积,从中取得最大值来得到答案。但实际上矩形高度不可能是单调递增的。...博文来自:MILLOPE的博客

  目录目录题目描述初步探究定义正文代码总结 前言此篇博客是我在CSDN发表的第一篇博客,现在看来文笔比现在差了许多。果然写博客确实提高了我的能力。单调栈是一个非常重要的数据结构,在我们的DP学到后期时,...博文来自:C20200521的博客

  问题描述试题编号: 201312-3 试题名称: 最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在横轴上放了n个相邻的矩...博文来自:红鲤鱼与绿鲤鱼与驴

  直方图中最大矩形((LargestRectangleinHistogram))问题:直方图是由排列在同一基线上的一系列矩形组成的多边形。为了简单起见,假设这些矩形的宽度相等但高度可能不同。例如,下图1...博文来自:q2nAmor

  (1)问题描述:直方图中最大矩形面积,一个直方图是有许多矩形组成的,在给定的直方图中找出最大的矩形面积,为了简化,假定所有矩形的宽为1。(2)直方图最大面积的算法理解:   1、将一个起伏的直方图分解...博文来自:的博客

  一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积。同时,为了简化问题,假定所有矩形宽度都为1个单位。例如,下面的直方图中有6个矩形,高度分别是(6,7,8,4,5,3)。最大的矩形面积是...博文来自:serena_0916的博客

  原题链接1158 全是1的最大子矩阵基准时间限制:1 秒空间限制:131072 KB分值: 80 难度:5级算法题 收藏 关注给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,...博文来自:L.

  求最大子矩阵的大小给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。例如:1110其中,最大的矩形区域有3个1,所以返回3。再如:10111111...博文来自:weixin_30915951的博客

  LargestRectangleinHistogram原题链接LargestRectangleinHistogram给定一个直方图,计算这个直方图中最大的矩形面积。输入的是直方图中每个柱的高度首先可以...博文来自:一个程序渣渣的小后院

  POJ-2559.LargestRectangleinaHistogramDescription直方图是由在公共基线处对齐的一系列矩形组成的多边形。矩形具有相等的宽度,但可以具有不同的高度。例如,图例...博文来自:紫藤&code的博客

  先上国家队dalao的博客:最大子矩阵算法论文算法一是以障碍物来判定极大子矩阵,即四边都有障碍物阻挡就是极大子矩阵。先将障碍物按升序排序,遍历每一个点并找到以这个点为左边界的极大子矩阵,复杂度O(s^...博文来自:xyyxyyx的博客

  1158 全是1的最大子矩阵基准时间限制:1 秒空间限制:131072 KB分值: 80 难度:5级算法题 收藏 关注给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的...博文来自:MR CODER

  原题:POJ3494题意:给出一个矩阵,求全1子矩阵的最大面积解析:开局的处理方式和最大求和子矩阵类似,压缩处理。预处理h[i][j],表示第i行第j列往上(行数递减方向)可以接上的全1串的最长长度,...博文来自:Jk_Chens Haven

  题目传送门题目大意:一个矩阵中,求F组成的矩阵的面积,(答案乘以三)。思路:n如果是小于100的,就可以通过前缀和,然后三重循环暴力找,和poj1050很像,但由于是1000,就不可以了,时间复杂度太...博文来自:weixin_30730053的博客

  遇到一个好人,可以改变一生;遇到一本好书,又何尝不是呢?最近在翻阅左程云先生的《程序员代码面试指南–IT名企算法与数据结构题目最优解》时就非常的有感悟。建议有这方面爱好的博友,也去观摩观摩。书中讲解的...博文来自:weixin_34006965的博客

  Leetcode编程练习二:求直方图中矩形最大面积博文来自:ether_crow的博客

  题意:给你一些柱子摆放在一起(像这样)(像这样)然后从中选出一个最大的子矩阵求其大小分析:对于每一根柱子作为矩形的高度之后向左向又扩展找最大矩形容易得到只有碰到比这根柱子低的柱子才会停止比这根柱子还要...博文来自:ranwen2的博客

  前几天看到一道算法题目,看起来挺简单,就是有一个由0和1构成的矩形,然后找到这个矩形中全部元素都是1的最大子矩形,初看起来好像挺简单,但是我想半天没有想出来。上网搜了下才发现,这道题目还挺有名的,很多...博文来自:leonliu1995的博客

  【题目描述】:地面上从左到右并排紧挨着摆放多个矩形,已知这此矩形的底边宽度都为1,高度不完全相等。求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有...博文来自:LvYanchang的博客

  题目:有N个矩形,宽度都为1,给出N个矩形的高度,求由这N个矩形组成的图形包含的最大的矩形面积。分析:对于每个矩形,我们求出它向左向右分别能延伸的长度,然后乘以它的高度,这就是以当前矩形为最低高度可以...博文来自:Broken_Wave的博客

  题目:给定一个01矩阵,求该矩阵内部的满足以下条件的最大的矩形的左上角所在的行和列,以及该矩形的长和宽。该矩形满足边上全为1,内部可0可1。(假定所有输入有且仅有一个矩形满足条件)packageTes...博文来自:少年乖

  题目描述已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1*1)子矩阵。比如,如下4*4的矩阵0-2-7092-62-41-41-180-2的最大子矩阵是9...博文来自:chengsilin666的博客

  【题目】给定一个矩阵matrix,其中矩阵中的元素可以包含正数、负数、和0,返回子矩阵的最大累加和。例如,矩阵matrix为:0-2-7092-62-41-41-180-2拥有最大和的子矩阵为:92-...博文来自:有图有真相

  题目来源:直方图内最大矩形有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7...博文来自:ccnnli的博客

  题目:给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。在这组柱状图中找到能组成的最大矩形的面积(如图所示)。入参h为一个整型数组,代表每个柱子的高度,返回面积的值。【美团...博文来自:sinat_38972110的博客

  题目:    给定一个整型矩阵matrix,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩阵区域为1的数量。   例如:   1 1 1 0   其中,最大的矩形区域有3个1,所有返回...博文来自:线上幽灵

  最大子矩阵的和(N*N的矩阵)题目描述:给定一个n行n列的矩阵,其中n的取值范围为0到100之间的整数,请找到此矩阵的一个子矩阵,并且此子矩阵的各个元素的和最大,输出这个最大的值。Example:0-...博文来自:梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。

http://linkzoo.net/tongliansuanfa/504.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有