代码:
参考上一篇博客,柱状图中最大的矩形——单调栈
func maximalRectangle(matrix [][]byte) (ans int) {
m, n := len(matrix), len(matrix[0])
left := make([][]int, m)
for i, row := range matrix {
left[i] = make([]int, n)
for j, v := range row {
if v == '0' {
continue
}
if j == 0 {
left[i][j] = 1
} else {
left[i][j] = left[i][j-1] + 1
}
}
}
for j := 0; j < n; j++ { // 对于每一列,使用基于柱状图的方法
up := make([]int, m)
down := make([]int, m)
for i := 0; i < m; i++ {
down[i] = m
}
stk := []int{}
for i, l := range left {
for len(stk) > 0 && left[stk[len(stk)-1]][j] >= l[j] {
down[stk[len(stk)-1]] = i
stk = stk[:len(stk)-1]
}
if len(stk) == 0{
up[i] = -1
}else {
up[i] = stk[len(stk)-1]
}
stk = append(stk, i)
}
for i, l := range left {
height := down[i] - up[i] - 1
area := height * l[j]
ans = max(ans, area)
}
}
return
}
func max(a, b int) int {
if a > b {
return a
}
return b
}