| 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))
 
- // }
 
 
  |