题目
给定 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比栈顶小,说明,栈顶元素的左右两边的元素都找到了
var largestRectangleArea = function (heights) {heights.push(0) //在末尾和头部添加0 使得可以避免单调递增的情况heights.unshift(0)const n = heights.lengthconst stack = []let res = 0for (let i = 0; i < n; i++) {const c = heights[i]while (stack && heights[stack[stack.length - 1]] > c) {const h = heights[stack.pop()]const w = i - stack[stack.length - 1] - 1res = Math.max(res, h * w)}stack.push(i)}return res};
