|
@@ -1,9 +1,69 @@
|
|
|
package main
|
|
|
|
|
|
-func maximalRectangle(matrix [][]byte) int {
|
|
|
- return 0
|
|
|
+func maximalRectangle(matrix [][]byte) (maxArea int) {
|
|
|
+ if len(matrix) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ hei := make([]int, len(matrix[0]))
|
|
|
+ for i := 0; i < len(matrix); i++ {
|
|
|
+ for j := 0; j < len(matrix[0]); j++ {
|
|
|
+ if matrix[i][j] == '1' {
|
|
|
+ hei[j]++
|
|
|
+ } else {
|
|
|
+ hei[j] = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Now we can find the max rectangle in the hist :)
|
|
|
+ st := make([]int, 0)
|
|
|
+ k, l := 0, 0
|
|
|
+ for k < len(hei) {
|
|
|
+ if l == 0 || hei[k] >= hei[st[l-1]] {
|
|
|
+ st = append(st, k)
|
|
|
+ k, l = k+1, l+1
|
|
|
+ } else {
|
|
|
+ t := st[l-1]
|
|
|
+ st = st[:l-1]
|
|
|
+ l--
|
|
|
+ var area int
|
|
|
+ if l == 0 {
|
|
|
+ area = hei[t] * k
|
|
|
+ } else {
|
|
|
+ area = hei[t] * (k - 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 = hei[t] * k
|
|
|
+ } else {
|
|
|
+ area = hei[t] * (k - st[l-1] - 1)
|
|
|
+ }
|
|
|
+ if area > maxArea {
|
|
|
+ maxArea = area
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
-
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// m := [][]byte{
|
|
|
+// {'1', '0', '1', '0', '0'},
|
|
|
+// {'1', '0', '1', '1', '1'},
|
|
|
+// {'1', '1', '1', '1', '1'},
|
|
|
+// {'1', '0', '0', '1', '0'}}
|
|
|
+// println(maximalRectangle(m))
|
|
|
+// m = [][]byte{
|
|
|
+// {'1', '0', '1', '0'},
|
|
|
+// {'1', '0', '1', '1'},
|
|
|
+// {'1', '0', '1', '1'},
|
|
|
+// {'1', '1', '1', '1'}}
|
|
|
+// println(maximalRectangle(m))
|
|
|
+// }
|