5.30——84. 柱状图中最大的矩形

Posted xiaoqichaoren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.30——84. 柱状图中最大的矩形相关的知识,希望对你有一定的参考价值。

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

技术图片

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

 

1.解题思路

  1. 对于一个柱体,如果能得到向左和向右的边界
  2. 那么就能对每个高度求一次面积
  3. 遍历所有高度,即可得出最大面积

上述暴力法的时间复杂度为 O(n²)。考虑用 空间换时间 的方法优化,考虑用单调栈来优化。以上述 [2,1,5,6,2,3] 为例:

①遍历到 2 ,将 2下标 0 压入栈;遍历到 11 比栈顶元素 02 的下标) 0 出栈,然后以高度为 2 的柱体为尾,向左延伸(从栈中取符合条件的栈顶元素)。找到能达到的最大矩形

②找到后,将刚刚的 1下标 1 压入栈,此时栈中元素只有 1 。继续遍历到 5 比 栈顶元素下标 1 的高度 1 大,把 5下标 2 入栈。同理,6下标 3 入栈

③此时栈中元素为 1,2,3 (对应的高度为 1,5,6。遍历到下标 4 ,对应的高度为 2 小于栈顶元素 6 。将下标 3 出栈。

④以高度为 6 的柱体为尾,向左延伸,找到最大的矩形。此时栈顶元素为 2 对应的高度为 5 。并且底边长为:4(出栈时遍历到的下标)- 2(栈顶元素的下标)(出栈时的下标 减去 当前柱体的下标)

⑤此时栈顶元素为 1 对应高为 1 。小于下标 4 对应的高 2 因此,将下标 4 入栈。然后将下标 5 入栈。栈更新为 1,4,5 。而此时对于数组的遍历结束了,栈中还有元素,我们需要继续将栈中的元素取出。

⑥将栈中元素取出。按照上述原则,继续循环构造出尽可能大的矩形

技术图片

 

写的可能不是很好,可以去看官方题解

 

2.源码

技术图片

以上是关于5.30——84. 柱状图中最大的矩形的主要内容,如果未能解决你的问题,请参考以下文章

java刷题--84柱状图中最大的矩形

84. 柱状图中最大的矩形

LeetCode84. 柱状图中最大的矩形

Leetcode 84.柱状图中最大的矩形

LeetCode 84. 柱状图中最大的矩形 | Python

LeetCode 84. 柱状图中最大的矩形 | Python