123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package main
- func largestRectangleAreaSlow(heights []int) (area int) {
- n := len(heights)
- if n == 0 {
- return
- }
- for i := 0; i < n; i++ {
- min := heights[i]
- for j := i; j < n; j++ {
- if heights[j] < min {
- min = heights[j]
- }
- if (j-i+1)*min > area {
- area = (j - i + 1) * min
- }
- }
- }
- return
- }
- func largestRectangleArea(heights []int) (maxArea int) {
- st := make([]int, 0) // The max area must be between two smaller bar
- i, l, n := 0, 0, len(heights)
- for i < n {
- if l == 0 || heights[i] >= heights[st[l-1]] {
- st = append(st, i)
- i, l = i+1, l+1
- } else {
- t := st[l-1]
- st = st[:l-1]
- l--
- var area int
- if l == 0 {
- area = heights[t] * i
- } else {
- area = heights[t] * (i - st[l-1] - 1)
- }
- if area > maxArea {
- maxArea = area
- }
- }
- }
- for l != 0 {
- t := st[l-1]
- st = st[:l-1]
- l--
- var area int
- if l == 0 {
- area = heights[t] * i
- } else {
- area = heights[t] * (i - st[l-1] - 1)
- }
- if area > maxArea {
- maxArea = area
- }
- }
- return
- }
- // func main() {
- // h := []int{2, 1, 5, 6, 2, 3}
- // println(largestRectangleArea(h))
- // h = []int{}
- // println(largestRectangleArea(h))
- // }
|