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

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


    评论

  • 相关阅读:
    Wannafly #4 F 线路规划
    PKUWC2018 随机算法
    noip模拟赛
    php 正则判断是否是手机号码 最新
    Onethink上传服务器后登录不了的问题
    【php中的curl】php中curl的详细解说
    50种网站引流量方式
    mysql ERROR 1045 (28000): 错误解决办法
    织梦DEDE分类信息实现联动筛选(支持多条件多级选项)解决方案
    dedecms新增联动类别后的使用方法
  • 原文地址:https://www.cnblogs.com/waitmoon/p/14559398.html
Copyright © 2011-2022 走看看