![](https://i-blog.csdnimg.cn/direct/c43af97ba50d45209ebeefd130466145.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法_单调栈
文章平均质量分 58
记录我学习单调栈的过程。
小豆同学198508
这个作者很懒,什么都没留下…
展开
-
全部由1组成的子矩形的数量
的数是第2个2,然后h=2-2=0, 没有计算以第一个2为最小高度时的子矩阵数,到了第2个2的时候,左边比它小的数没有,右边比它小的数也没有,h=2-0=2, 到了第2个2的时候才计算了下面的阴影部分的子矩阵的数量,这样就不会算重复,只会在最后一个2的时候去计算以2为最低高度的时候那块高度为2连通的大区域的子矩阵数,必须是。(地基必被算)得到一个个直方图数组去算去加和,其实你按我上面的说法1-1,1-2,1-3....,不同高度这样一行一行的去算就知道对不对了。第二行:2 2 2 2 0 2。原创 2024-07-21 06:00:58 · 242 阅读 · 0 评论 -
最大子矩形中1的个数
如果去枚举子矩形的话,需要取对角线上的2个点,取一个点的时间复杂度是O(n^2),取两个点形成的可能就是 n^4,取到子矩形之后还要判断内部是不是都是1,需要n^2,所以最暴力的时间复杂度就是 O(n^6)。给定一个二维数组 matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形中1的个数。比如,下面这个图中由1组成的最大子矩形的1的个数就是12。),取max,就能得到最大的子矩形中1的个数了,将二维问题转变为了一维问题,所以就是像下面这样。第一行:1 1 1 1 0 1。原创 2024-07-21 04:17:55 · 217 阅读 · 0 评论 -
直方图的最大长方形面积
遍历arr数组,以当前遍历到的数组元素作为它所在的长方形中的最小的高,向它的两边往外扩,那么当遇到左边的最近的比它小的元素和右边离它最近且比它小的元素时,停止扩张,中间的区域都是能以它作为最小的高的长条,计算长方形面积 = 当前最小高 * 区域长度,取max。给定一个非负数(0和正数),代表直方图,返回直方图的最大长方形面积,比如,arr = {3, 2, 4, 2, 5},那么直方图就是下面这个样子的,最大的长方形面积为图中阴影部分面积,为2*5 = 10。原创 2024-07-21 02:07:02 · 157 阅读 · 0 评论 -
子数组的最大值
所以是,有重复值时(比如这里的6,以当前值为最小值,我前面的6都做过最小值了,所以不算,所以其实最后一个6计算出来的M值是最大的,因为子数组是 6 6 6, 第一个6以自己做最小值的子数组是 6,第2个6以自己做最小值的子数组是 6,6。对于数组 arr 中的所有值,假设每个值都能当一次它所在的子数组中的最小值,那么要让 M 尽可能的大,就需要子数组sub的累加和尽可能的大了,所以对于当前作为最小值的元素,找到它的左边和右边离它最近且比它。3 6 6 (第一个6的左边是3,右边是第2个6),原创 2024-07-21 00:25:14 · 219 阅读 · 0 评论 -
单调栈基础题
(栈里放的是元素下标,元素值通过arr[下标] 获取到)如果 arr 中有重复的元素,那么往栈中放的就不应该是下标了,就应该是下标的列表,{0,1}这样,还是遍历arr 数组,如果当前元素比 栈顶 中下标列表对应的元素(可以取列表最后一个下标)要小,那么让栈中的下标列表出栈,这些下标对应元素的左侧离它最小的值的下标都是栈中它的位置的下一个列表的最后一个下标,而右边离它最小的值的下标就是当前遍历到的下标。单调栈说的是栈在放入元素时总会维持栈中元素的有序,比如栈中元素从下到上都是递增的 or 递减的。原创 2024-07-20 18:57:56 · 230 阅读 · 0 评论