zoukankan      html  css  js  c++  java
  • 2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1。

    2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1。

    福大大 答案2021-03-19:

    按行遍历二维数组,构造直方图。
    单调栈,大压小。有代码。

    代码用golang编写,代码如下:

    package main
    
    import "fmt"
    
    func main() {
        matrix := [][]byte{
            {1, 1, 1},
            {1, 0, 1},
            {1, 1, 1},
            {1, 1, 1}}
        ret := maximalRectangle(matrix)
        fmt.Println(ret)
    }
    func maximalRectangle(matrix [][]byte) (ans int) {
        rowsLen := len(matrix)
        colsLen := len(matrix[0])
        height := make([]int, colsLen)
        maxArea := 0
        for i := 0; i < rowsLen; i++ {
            for j := 0; j < colsLen; j++ {
                if matrix[i][j] == 0 {
                    height[j] = 0
                } else {
                    height[j]++
                }
                maxArea = getMax(maxArea, largestRectangleArea(height))
            }
        }
        return maxArea
    }
    
    func largestRectangleArea(height []int) int {
        if len(height) == 0 {
            return 0
        }
        N := len(height)
        stack := make([]int, N)
        si := -1
        maxArea := 0
        for i := 0; i < N; i++ {
            for si != -1 && height[i] <= height[stack[si]] {
                j := stack[si]
                si--
                k := 0
                if si == -1 {
                    k = -1
                } else {
                    k = stack[si]
                }
                curArea := (i - k - 1) * height[j]
                maxArea = getMax(maxArea, curArea)
            }
            si++
            stack[si] = i
        }
        for si != -1 {
            j := stack[si]
            si--
            k := 0
            if si == -1 {
                k = -1
            } else {
                k = stack[si]
            }
            curArea := (N - k - 1) * height[j]
            maxArea = getMax(maxArea, curArea)
        }
        return maxArea
    }
    func getMax(a int, b int) int {
        if a > b {
            return a
        } else {
            return b
        }
    }
    

    执行结果如下:
    在这里插入图片描述


    评论

  • 相关阅读:
    队列<一>
    二叉树的遍历[先序,中序,后序]
    The method format(String, Object[]) in the type String is not applicable for the arguments
    sqlserver 备份 与 还原
    sqlserver 无法获得数据库独占权
    page.isvalid
    bzoj3994 [SDOI2015]约数个数和
    bzoj4868 [Shoi2017]期末考试
    bzoj1179 [Apio2009]Atm
    bzoj4869 [Shoi2017]相逢是问候
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14559398.html
Copyright © 2011-2022 走看看