找到最大的由1组成的矩形

4

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

给定一个填充有0和1的2D二进制矩阵,找到包含所有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

2
请遵循帮助文档中给出的发布准则。MCVE 在此适用。展示您的程序无法正常工作的输入;展示您得到的输出(特别是添加了调试打印语句)。您的问题描述很好。最重要的是,您不应该问我们您的程序是否有效。在发布之前,您应该知道这一点。如果您不确定,请进行测试。当您遇到问题时,我们是可以帮助您解决它的地方。 - Prune
1
可能是Puzzle: Find largest rectangle (maximal rectangle problem)的重复问题。 - m69 ''snarky and unwelcoming''
1个回答

4

我在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;
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接