题目

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

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

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

输入: [2,1,5,6,2,3]
输出: 10

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


题解

1.暴力
只要遍历每一个柱子,并分别找出其左右两边比它低的柱子,就可以找出宽度,然后计算面积,最后找出最大面积
2.单调栈
根据1暴力解,我们能否O(1)的找出左边比它小的第一根柱子呢?
答:利用单调递增栈。i-1肯定比i小
所以,只要元素i比栈顶小,说明,栈顶元素的左右两边的元素都找到了

  1. var largestRectangleArea = function (heights) {
  2. heights.push(0) //在末尾和头部添加0 使得可以避免单调递增的情况
  3. heights.unshift(0)
  4. const n = heights.length
  5. const stack = []
  6. let res = 0
  7. for (let i = 0; i < n; i++) {
  8. const c = heights[i]
  9. while (stack && heights[stack[stack.length - 1]] > c) {
  10. const h = heights[stack.pop()]
  11. const w = i - stack[stack.length - 1] - 1
  12. res = Math.max(res, h * w)
  13. }
  14. stack.push(i)
  15. }
  16. return res
  17. };