给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1
。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4] 输出: 4
提示:
-
1 <= heights.length <=105
-
0 <= heights[i] <= 104
单调递增栈
当需要出栈的时候,就是当前元素小于栈顶元素。这样,弹出栈顶元素,以弹出的栈顶元素作为高,由于是单调递增栈,现在栈顶元素是小于已弹出的栈顶元素。所以,栈顶元素和当前坐标就是以弹出的栈顶元素的左右两个更低的柱子。那么,就弹出的栈顶元素作为高,当前坐标-栈顶元素(存的坐标)-1作为宽,就可以计算相关柱子组成的面积了。
哨兵技巧非常巧妙。即可减少栈的非空判断,又可以推进剩余元素的计算(如果没有最后的零点哨兵,栈里单调递增的元素最后还要单独处理。)
- 一刷
-
link:{sourcedir}/_0084_LargestRectangleInHistogram.java[role=include]
-
84. 柱状图中最大的矩形 - 暴力解法、栈(单调栈、哨兵技巧) — 哨兵技巧牛逼
-
84. 柱状图中最大的矩形 - 官方题解 — 看的稀里糊涂。