2021-09-0884. 柱状图中最大的矩形 栈
给定 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. 柱状图中最大的矩形 栈相关推荐
- c语言力扣l最大矩形,leetcode 84柱状图中最大的矩形,利用单调栈求解l
利用单调了栈求解leetcode 84柱状图中最大的矩形 image image 利用单调递增栈的方式来实现,计算发生在每次弹出栈顶的操作过程中 单调递增栈的操作步骤 1.如果栈为空或者栈顶元素比入栈 ...
- LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)
柱状图中最大的矩形(暴力法,单调栈) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 暴力法 3.2 单调栈 4. Java实现 1. 题目描述 难度:困难 2. 题目分析 这道题有两种解法 ...
- 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形
84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...
- 【LeetCode】【HOT】84. 柱状图中最大的矩形(栈)
[LeetCode][HOT]84. 柱状图中最大的矩形 文章目录 [LeetCode][HOT]84. 柱状图中最大的矩形 package hot;import java.util.ArrayDeq ...
- java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形
84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的 ...
- 在柱状图中找最大矩形——O(n)时间复杂度java实现
在柱状图中找最大矩形--O(n)时间复杂度java实现 ZZ:http://blog.csdn.net/xybsos/article/details/8049048 具体题目如下:给一组非负的整数来表 ...
- 柱状图中最大的矩形多种解法
一.前言 问题来源LeetCode 84,难度:困难 问题链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 二.题 ...
- leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、
lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...
- LeetCode 84.柱状图中最大的矩形
今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一下备忘录是 ...
- 用python 求矩形最大面积_LeetCode 84. 柱状图中最大的矩形 | Python
84. 柱状图中最大的矩形 题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个 ...
最新文章
- ACMNO.31 C语言-宏求余 输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
- WCF 入门之旅(4): 怎样用客户端调用WCF服务
- 在Python中使用正则表达式去掉字符串里的html标签
- ADO.NET Entity Framework学习笔记(2)建模[转]
- Socket网络编程--小小网盘程序(3)
- 阿里与网易考拉收购案谈崩?后者股价下跌5.01%
- iOS 地图移动中心点获取
- 数字信号处理实验matlab版答案刘舒帆,数字信号处理实验指导书(MATLAB版) 随书代码...
- BXP无盘Windows XP系统好处(转)
- 协同过滤推荐算法(一)原理与实现
- 独木难成林,不管是自己在支付宝单种还是钉钉合种,都是在做公益
- Mac操作指南:访问Windows共享文件
- ABeam Insight | 女性科技系列(3):国内外女性科技(FemTech)企业介绍
- 【精讲】微信小程序 基础内容(组件)入门
- vue手写上一页下一页
- 如何生成EI检索报告
- 程序编写——四步制作漫画线稿出书
- msn名字大集合(转)
- 在excel中某些单元格内批量增加相同的内容
- 【图片新闻】30年前沉没在挪威海底的前苏联核潜艇仍然在不断泄漏放射性物质...