计算面积并更新最大值:area = heightcur × (i - stack_top - 1)。
重复弹出过程,直到当前柱子高度不再小于栈顶高度,然后将当前索引入栈。
Go复制代码
func largestRectangleArea(heights []int) int {
ans := 0
n := len(heights)
// 创建新数组,前后各加一个 0 作为哨兵,避免栈空判断
h := make([]int, n+2)
copy(h[1:], heights)
// st 存的是索引,把左哨兵的索引 0 放入栈中
st := []int{0}
for i := 1; i < len(h); i++ {
// 当前高度小于栈顶高度时,说明找到了栈顶柱子的右边界
for h[i] < h[st[len(st)-1]] {
// 弹出栈顶作为当前要计算面积的柱子
cur := st[len(st)-1]
st = st[:len(st)-1]
// 此时新的栈顶就是 cur 的左边界
w := i - st[len(st)-1] - 1
area := h[cur] * w
if area > ans {
ans = area
}
}
// 当前索引入栈,保持栈内索引对应的高度单调递增
st = append(st, i)
}
return ans
}