123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- package main
- 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() {
- // 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))
- // }
|