| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | package mainfunc 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))// }
 |