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

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

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

方法二:单调栈 + 常数优化
在方法一中,我们首先从左往右对数组进行遍历,借助单调栈求出了每根柱子的左边界,随后从右往左对数组进行遍历,借助单调栈求出了每根柱子的右边界。那么我们是否可以只遍历一次就求出答案呢?

答案是可以的。在方法一中,我们在对位置 i 进行入栈操作时,确定了它的左边界。从直觉上来说,与之对应的我们在对位置 i 进行出栈操作时可以确定它的右边界!仔细想一想,这确实是对的。当位置 i 被弹出栈时,说明此时遍历到的位置  的高度小于等于,并且在与 i 之间没有其他高度小于等于的柱子。这是因为,如果在 ii 和 i_0i 
0
​    
  之间还有其它位置的高度小于等于 \textit{height}[i]height[i] 的,那么在遍历到那个位置的时候,ii 应该已经被弹出栈了。所以位置 i_0i 
0 就是位置 ii 的右边界。

等等,我们需要的是「一根柱子的左侧且最近的小于其高度的柱子」,但这里我们求的是小于等于,那么会造成什么影响呢?答案是:我们确实无法求出正确的右边界,但对最终的答案没有任何影响。这是因为在答案对应的矩形中,如果有若干个柱子的高度都等于矩形的高度,那么最右侧的那根柱子是可以求出正确的右边界的,而我们没有对求出左边界的算法进行任何改动,因此最终的答案还是可以从最右侧的与矩形高度相同的柱子求得的。读者可以仔细思考一下这一步。

在遍历结束后,栈中仍然有一些位置,这些位置对应的右边界就是位置为 nn 的「哨兵」。我们可以将它们依次出栈并更新右边界,也可以在初始化右边界数组时就将所有的元素的值置为 nn。

我们沿用方法一中的例子 [6, 7, 5, 2, 4, 5, 9, 3][6,7,5,2,4,5,9,3],下面的幻灯片给出了优化后的流程。

class Solution:def largestRectangleArea(self, heights: List[int]) -> int:n = len(heights)left, right = [0] * n, [n] * nmono_stack = list()for i in range(n):while mono_stack and heights[mono_stack[-1]] >= heights[i]:right[mono_stack[-1]] = imono_stack.pop()left[i] = mono_stack[-1] if mono_stack else -1mono_stack.append(i)ans = max((right[i] - left[i] - 1) * heights[i] for i in range(n)) if n > 0 else 0return ans
class Solution:def largestRectangleArea(self,heights: List[int]) -> int:n = len(heights)left, right = [0]*n,[n]*nmono_stack = list()for i in range(n):while mono_stack and heights[mono_stack[-1]] >= heights[i]:right[mono_stack[-1]] =imono_stack.pop()left[i] = mono_stack[-1] if mono_stack else -1mono_stack.append(i)ans = max((right[i]-left[i]-1)* heights[i] for i in range(n) if n>0 else 0return ans
#柱状图中最大的矩形 栈
class Solution:def largestRectangleArea(self, heights:List[int] ->int:    n = len(heights)left,right =[0]*n,[n]*nmono_stack = list()for i in range(n):while mono_stack and heights[mono_stack[-1]] >= heights[i]:right[mono_stack[-1]] =imono_stack.pop()left[i] = mono_stack[-1] if mono_stack else -1mono_stack.append(i)ans = max((right[i]-left[i]-1)*heights[i] for i in range(n)) if n>0 else 0return ans

2021-09-0884. 柱状图中最大的矩形 栈相关推荐

  1. c语言力扣l最大矩形,leetcode 84柱状图中最大的矩形,利用单调栈求解l

    利用单调了栈求解leetcode 84柱状图中最大的矩形 image image 利用单调递增栈的方式来实现,计算发生在每次弹出栈顶的操作过程中 单调递增栈的操作步骤 1.如果栈为空或者栈顶元素比入栈 ...

  2. LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)

    柱状图中最大的矩形(暴力法,单调栈) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 暴力法 3.2 单调栈 4. Java实现 1. 题目描述 难度:困难 2. 题目分析 这道题有两种解法 ...

  3. 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形

    84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...

  4. 【LeetCode】【HOT】84. 柱状图中最大的矩形(栈)

    [LeetCode][HOT]84. 柱状图中最大的矩形 文章目录 [LeetCode][HOT]84. 柱状图中最大的矩形 package hot;import java.util.ArrayDeq ...

  5. java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形

    84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的 ...

  6. 在柱状图中找最大矩形——O(n)时间复杂度java实现

    在柱状图中找最大矩形--O(n)时间复杂度java实现 ZZ:http://blog.csdn.net/xybsos/article/details/8049048 具体题目如下:给一组非负的整数来表 ...

  7. 柱状图中最大的矩形多种解法

    一.前言 问题来源LeetCode 84,难度:困难 问题链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 二.题 ...

  8. leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、

    lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...

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

    今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一下备忘录是 ...

  10. 用python 求矩形最大面积_LeetCode 84. 柱状图中最大的矩形 | Python

    84. 柱状图中最大的矩形 题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个 ...

最新文章

  1. ACMNO.31 C语言-宏求余 输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
  2. WCF 入门之旅(4): 怎样用客户端调用WCF服务
  3. 在Python中使用正则表达式去掉字符串里的html标签
  4. ADO.NET Entity Framework学习笔记(2)建模[转]
  5. Socket网络编程--小小网盘程序(3)
  6. 阿里与网易考拉收购案谈崩?后者股价下跌5.01%
  7. iOS 地图移动中心点获取
  8. 数字信号处理实验matlab版答案刘舒帆,数字信号处理实验指导书(MATLAB版) 随书代码...
  9. BXP无盘Windows XP系统好处(转)
  10. 协同过滤推荐算法(一)原理与实现
  11. 独木难成林,不管是自己在支付宝单种还是钉钉合种,都是在做公益
  12. Mac操作指南:访问Windows共享文件
  13. ABeam Insight | 女性科技系列(3):国内外女性科技(FemTech)企业介绍
  14. 【精讲】微信小程序 基础内容(组件)入门
  15. vue手写上一页下一页
  16. 如何生成EI检索报告
  17. 程序编写——四步制作漫画线稿出书
  18. msn名字大集合(转)
  19. 在excel中某些单元格内批量增加相同的内容
  20. 【图片新闻】30年前沉没在挪威海底的前苏联核潜艇仍然在不断泄漏放射性物质...

热门文章

  1. 使用Requests+xpath实现简单的数据爬取
  2. wpf treeview 绑定不同的对象
  3. Javascript 细节散记
  4. Mac下使用Docker快速搭建pinpont追踪系统APM
  5. gcc/g++ 如何支持c11/c++11标准编译
  6. python+selenium常见坑
  7. UserDefault使用
  8. Oracle 区管理和段空间管理小结
  9. 鸿蒙os运行内存,体验亮点满满!鸿蒙OS系统6月份开启适配,不只有华为手机
  10. wordpress音乐播放器插件–PoiPlayer