84.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package main
  2. func largestRectangleAreaSlow(heights []int) (area int) {
  3. n := len(heights)
  4. if n == 0 {
  5. return
  6. }
  7. for i := 0; i < n; i++ {
  8. min := heights[i]
  9. for j := i; j < n; j++ {
  10. if heights[j] < min {
  11. min = heights[j]
  12. }
  13. if (j-i+1)*min > area {
  14. area = (j - i + 1) * min
  15. }
  16. }
  17. }
  18. return
  19. }
  20. func largestRectangleArea(heights []int) (maxArea int) {
  21. st := make([]int, 0) // The max area must be between two smaller bar
  22. i, l, n := 0, 0, len(heights)
  23. for i < n {
  24. if l == 0 || heights[i] >= heights[st[l-1]] {
  25. st = append(st, i)
  26. i, l = i+1, l+1
  27. } else {
  28. t := st[l-1]
  29. st = st[:l-1]
  30. l--
  31. var area int
  32. if l == 0 {
  33. area = heights[t] * i
  34. } else {
  35. area = heights[t] * (i - st[l-1] - 1)
  36. }
  37. if area > maxArea {
  38. maxArea = area
  39. }
  40. }
  41. }
  42. for l != 0 {
  43. t := st[l-1]
  44. st = st[:l-1]
  45. l--
  46. var area int
  47. if l == 0 {
  48. area = heights[t] * i
  49. } else {
  50. area = heights[t] * (i - st[l-1] - 1)
  51. }
  52. if area > maxArea {
  53. maxArea = area
  54. }
  55. }
  56. return
  57. }
  58. // func main() {
  59. // h := []int{2, 1, 5, 6, 2, 3}
  60. // println(largestRectangleArea(h))
  61. // h = []int{}
  62. // println(largestRectangleArea(h))
  63. // }