29 lines
589 B
Go
29 lines
589 B
Go
package q84
|
|
|
|
func largestRectangleArea(heights []int) int {
|
|
var largest int
|
|
st := make([][2]int, 0, 256) // x index, height
|
|
|
|
for x, h := range heights {
|
|
minX := x
|
|
for len(st) > 0 && st[len(st)-1][1] > h {
|
|
largest = max(largest, st[len(st)-1][1]*(x-st[len(st)-1][0]))
|
|
minX = min(minX, st[len(st)-1][0])
|
|
st = st[:len(st)-1]
|
|
}
|
|
|
|
if len(st) > 0 && st[len(st)-1][1] == h {
|
|
continue
|
|
}
|
|
st = append(st, [2]int{minX, h})
|
|
}
|
|
|
|
for i := range st {
|
|
x, h := st[i][0], st[i][1]
|
|
largest = max(largest, h*(len(heights)-x))
|
|
}
|
|
|
|
return largest
|
|
}
|
|
|
|
var _ = largestRectangleArea
|