LeetCode73 - 柱状图中最大的矩形
📝 题目描述
题目链接:柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例:
示例 1:
1 | 输入:heights = [2,1,5,6,2,3] |
示例 2:
1 | 输入: heights = [2,4] |
提示:
1 <= heights.length <=10^50 <= heights[i] <= 10^4
💡 解题思路
方法一:单调栈
这个题跟接雨水比较相像,接雨水要找出一个柱子左右两边第一个大于该柱子高度的柱子,本题是找每个柱子左右两边第一个小于该柱子的柱子。
本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序。
为了不再判断特例,可以设置两个哨兵节点,也就是高度为 0 的柱子到题目数组的两边,以便于我们及时将所有元素出栈。
维护一个非严格单调递增栈:
- 栈非空且当前遍历到的元素
heights[i]比栈顶元素heights[stk.top()]小,那么说明我们的栈顶元素可以出栈了。- 对于栈顶元素
stk.top()我们可以想象,首先可以确定当前元素i比其要低,那么我们无法继续向遍历方向拓展,又可得知我们是一个非严格单调递增栈,唯一向遍历方向相反的方向拓展的可能是紧挨着自己有相同高度的柱子。于是我们可以计算出高度height = heights[stk.top()];宽度我们可以设置一个循环,如果新栈顶元素高度与自己相同,则可以继续出栈,否则计算宽度width = stk.top() - i - 1,计算出面积并更新最大值。
- 对于栈顶元素
- 重复上面的流程,然后将当前遍历到的元素
i入栈。
🔧 代码实现
1、单调栈
1 | class Solution { |
📊 复杂度分析
1、单调栈
- 时间复杂度:,每个元素最多入栈一次、出栈一次。
- 空间复杂度:,使用一个栈和若干常数变量。
🎯 总结
- 核心思想:掌握单调栈的模板写法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 很多时候不懂事!