|
@@ -1,12 +1,66 @@
|
|
|
package main
|
|
|
|
|
|
-func largestRectangleArea(heights []int) int {
|
|
|
- return 0
|
|
|
+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 main() {
|
|
|
- h := []int{2, 1, 5, 6, 2, 3}
|
|
|
- println(largestRectangleArea(h))
|
|
|
- h = []int{}
|
|
|
- println(largestRectangleArea(h))
|
|
|
+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))
|
|
|
+// }
|