题目
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
解析
首先这道题整体的思路上分为:求出每个位置的最大矩形面积,然后整体选择最大的那个。在此基础上,要求每个位置的最大面积,高度首先有了是heights[i],主要是宽度,宽度的取法是:
- 在 i 左侧的小于 h 的最近元素的下标 left。
- 在 i 右侧的小于 h 的最近元素的下标 right
那么面积就是:h⋅(right−left−1)。
在此基础上,要直到最近的下标,可以用单调栈来保存,然后将符合的结果分别放到left和right数组中进行保存。若栈中没有数据,那么left里面放-1,right里面放n
func largestRectangleArea(heights []int) int {
n := len(heights)
left := make([]int, n)
stack := []int{}
for i := 0; i < n; i++ {
for len(stack) > 0 && heights[i] <= heights[stack[len(stack)-1]] {
stack = stack[:len(stack)-1]
}
if len(stack) > 0 {
left[i] = stack[len(stack)-1]
} else {
left[i] = -1
}
stack = append(stack, i)
}
stack = []int{}
right := make([]int, n)
for i := n - 1; i >= 0; i-- {
for len(stack) > 0 && heights[i] <= heights[stack[len(stack)-1]] {
stack = stack[:len(stack)-1]
}
if len(stack) > 0 {
right[i] = stack[len(stack)-1]
} else {
right[i] = n
}
stack = append(stack, i)
}
var ans int
for i, val := range heights {
ans = max(ans, val*(right[i]-left[i]-1))
}
return ans
}