最大矩形——单调栈

61 阅读1分钟

image.png

代码:

参考上一篇博客,柱状图中最大的矩形——单调栈

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
}