首页 > 编程语言 > 详细

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

时间:2021-03-19 21:43:25      阅读:52      评论:0      收藏:0      [点我收藏+]
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
    }
}

执行结果如下:
技术分享图片


评论

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

原文:https://blog.51cto.com/14891145/2665946

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!