找到1s的最大矩形

Posted

技术标签:

【中文标题】找到1s的最大矩形【英文标题】:finding max rectangle of 1s 【发布时间】:2016-01-24 10:08:54 【问题描述】:

我正在调试以下问题并发布问题陈述和代码。我的问题是,我认为 for 循环(for i in range(m) and for j in xrange(n))是不正确的,因为它只考虑顶行的矩形?如果我错了,请随时纠正我。谢谢。

给定一个用 0 和 1 填充的二维二进制矩阵,找到包含所有 1 的最大矩形并返回其面积。

def maximalRectangle(self, matrix):
    if not matrix:
        return 0
    m, n, A = len(matrix), len(matrix[0]), 0
    height = [0 for _ in range(n)]
    for i in range(m):
        for j in xrange(n):
            height[j] = height[j]+1 if matrix[i][j]=="1" else 0
        A = max(A, self.largestRectangleArea(height))
    return A


def largestRectangleArea(self, height):
    height.append(0)
    stack, A = [0], 0
    for i in range(1, len(height)):
        while stack and height[stack[-1]] > height[i]: 
            h = height[stack.pop()]
            w = i if not stack else i-stack[-1]-1 
            A = max(A, w*h)
        stack.append(i)
    return A

【问题讨论】:

请遵循帮助文档中的发布指南。 MCVE 适用于此。显示您的程序不起作用的输入;显示你得到的输出(尤其是添加了调试打印语句)。你的问题描述没问题。最重要的是,您不应该问我们您的程序是否有效。你应该在发帖之前知道这一点。如果您不确定,请测试。当您发现问题时,我们会帮助您解决问题。 Puzzle: Find largest rectangle (maximal rectangle problem)的可能重复 【参考方案1】:

我在 Java 中的解决方案:

public class Solution 
    public int maximalSquare(char[][] matrix) 
        if (matrix.length == 0 || matrix[0].length == 0) 
            return 0;
        

        int rows = matrix.length;
        int cols = matrix[0].length;
        int[][] length = new int[rows][cols];
        int result = 0;

        for (int i = 0; i < rows; i++) 
            length[i][0] = Character.getNumericValue(matrix[i][0]);
            result = Math.max(result, length[i][0]);
        

        for (int j = 0; j < cols; j++) 
            length[0][j] = Character.getNumericValue(matrix[0][j]);
            result = Math.max(result, length[0][j]);
        

        for (int i = 1; i < rows; i++) 
            for (int j = 1; j < cols; j++) 
                if (matrix[i][j] == '1') 
                    length[i][j] = Math.min(
                            Math.min(length[i - 1][j], length[i][j - 1]),
                            length[i - 1][j - 1]) + 1;
                    result = Math.max(result, length[i][j] * length[i][j]);
                
            
        

        return result;
    

【讨论】:

感谢伊隆,“长度[i - 1][j],长度[i][j - 1])”我不确定它是否正确,因为你怎么知道长度[ i - 1][j] 和 length[i][j - 1] 可以组成连续的正方形吗?它们只是使用 i-1/j 或使用 i/j-1 字符表示最大平方(结束一个可能不是邻居 [i][j])?如果我错了,请随时纠正我。 我使用 Math.min(length[i-1][j], length[i][j-1], length[i-1][j-1]) 来查找哪个邻居长度[i][j] 可以与矩阵[i][j] 一起形成一个1s 的正方形。您可以编写一个主函数并使用输入测试我的代码。 感谢伊隆,喜欢您的实施并将您的回复标记为已回答。祝你有美好的一天。 :)

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

在其他多边形中找到最大空矩形的算法

在二维数组的矩形区域内找到最大值的快速方法

最大子矩形之和

LeetCode 85 | 如何从矩阵当中找到数字围成的最大矩形的面积?

最大子矩形

任意多边形中的最大内接矩形