035_最大矩形

Posted cenyol

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了035_最大矩形相关的知识,希望对你有一定的参考价值。

知识点:动态规划、单调栈

LeetCode第八十五题:https://leetcode-cn.com/problems/maximal-rectangle/submissions/

有些题目是真的难,比如这题,答案都不一定抄的明白。

语言:GoLang

// 结合LeetCode 84题,逐行计算。抽象问题并结合已有题目的想象力?太难了
func maximalRectangle(matrix [][]byte) int {
    rowLen := len(matrix)
    if rowLen == 0 {
        return 0
    }

    colLen := len(matrix[0])

    heightMat := make([][]int, rowLen)
    for i := 0; i < rowLen; i++ {
        heightMat[i] = make([]int, colLen)
    }

    for j := 0; j < colLen; j++ {
        height := 0
        for i := 0; i < rowLen; i++ {
            if matrix[i][j] == ‘1‘ {
                height++
            } else {
                height = 0
            }
            heightMat[i][j] = height
        }
    }

    maxArea := 0
    for i := 0; i < rowLen; i++ {
        area := largestRectangleArea(heightMat[i])
        if area > maxArea {
            maxArea = area
        }
    }
    return maxArea
}

func largestRectangleArea(heights []int) int {
    heights = append(append([]int{0}, heights...), 0)
    length := len(heights)

    maxArea := 0
    stack := make([]int, 0)
    for i := 0; i < length; i++ {
        size := len(stack)
        for size > 0 && heights[i] < heights[stack[size - 1]] {
            tmpHeight := stack[size - 1]
            stack = stack[:size - 1]

            size = len(stack)
            area := (i - stack[size - 1] - 1) * heights[tmpHeight]
            if maxArea <  area {
                maxArea = area
            }
        }
        stack = append(stack, i)
    }
    return maxArea
}

以上是关于035_最大矩形的主要内容,如果未能解决你的问题,请参考以下文章

最大矩形面积

UOJ #48.最大矩形面积

opencv 最大内接矩形笔记

51nod_1102_面积最大的矩形

乘风破浪:LeetCode真题_035_Search Insert Position

CCF_ 201312-3_最大的矩形