题目
给定 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
}