题目:84. 柱状图中最大的矩形
思路:
实现要确定一个核心问题:包含完整一个柱子的最大矩形要找到这根柱子左侧最后一个高于他的柱子以及右侧最后一个高于他的柱子的位置(等同于左侧第一个小于他,右侧第一个小于他,因为+1 -1就是)
只要get到一个点,比如:30 50 70 80 60 70 40 这一段柱子,在遍历到40时,栈内元素是 30 50 60,当遇到40时,60这个数就同时拥有了左侧最小值的位置(即50的位置),以及右侧最小值的位置(即40的位置),那么在50到60 以及 60 - 40之间的柱子都是大于60的(70,80 | 70)。也就是说在60这个高度上能取到的宽度就是4( 70 80 60 70 ),也就是说40的位置(6) - 50的位置(1) - 1 = 宽度(4)。
代码:
func largestRectangleArea(heights []int) int {
max := 0
stack := make([]int, 0)
heights = append([]int{0}, heights...)
heights = append(heights, 0)
stack = append(stack, 0)
for i := 1; i < len(heights); i++ {
for heights[stack[len(stack)-1]] > heights[i] {
mid := stack[len(stack)-1]
stack = stack[0 : len(stack)-1]
left := stack[len(stack)-1]
tmp := heights[mid] * (i - left - 1)
if tmp > max {
max = tmp
}
}
stack = append(stack, i)
}
return max
}