一个矩阵仅包含0或1,求由1组成的最大矩阵面积

举报
i-WIFI 发表于 2025/02/28 20:20:15 2025/02/28
45 0 0
【摘要】 要解决寻找由1组成的最大矩阵面积的问题,可以采用动态规划(Dynamic Programming, DP)的方法。以下是详细的解决方案及其步骤: 问题背景给定一个二维矩阵 matrix,矩阵中每个元素都是0或1。目标是找到一个由1组成的最大矩形的面积。 解决步骤理解问题每个1可以作为矩形的一个边界,需要找到以这些1为边界的最大矩形。转换问题将问题转换为计算每个位置作为矩形底部时的最大高度,然...

要解决寻找由1组成的最大矩阵面积的问题,可以采用动态规划(Dynamic Programming, DP)的方法。以下是详细的解决方案及其步骤:

问题背景

给定一个二维矩阵 matrix,矩阵中每个元素都是0或1。目标是找到一个由1组成的最大矩形的面积。

解决步骤

  1. 理解问题

    • 每个1可以作为矩形的一个边界,需要找到以这些1为边界的最大矩形。
  2. 转换问题

    • 将问题转换为计算每个位置作为矩形底部时的最大高度,然后利用这些高度计算最大的矩形面积。
  3. 动态规划思路

    • 对于每一行,计算从该行到矩阵顶部(或上一行的底部)连续1的长度。这将给出该行每一个位置作为矩形底部时的高度。
    • 使用这些高度,计算从该行开始向上的最大矩形面积。
  4. 实现细节

    • 初始化一个与矩阵同高的 heights 数组,用于记录每个位置的连续1的长度。
    • 遍历矩阵的每一行,更新 heights 数组。
    • 对于每一行,使用一个辅助函数(如 largestRectangleArea)来找到这一行作为底部时最大矩形的面积。
    • 跟踪所有行作为底部时最大面积的最大值。
  5. 辅助函数 - 计算最大矩形面积

    • 使用单调栈(Monotonic Stack)来高效计算给定高度数组的最大矩形面积,该方法的时间复杂度为O(n)。

Python 代码实现

def largestRectangleArea(heights):
    stack = [-1]
    max_area = 0
    for i in range(len(heights)):
        while stack[-1] != -1 and heights[stack[-1]] >= heights[i]:
            h = heights[stack.pop()]
            w = i - stack[-1] - 1
            max_area = max(max_area, h * w)
        stack.append(i)
    while stack[-1] != -1:
        h = heights[stack.pop()]
        w = len(heights) - stack[-1] - 1
        max_area = max(max_area, h * w)
    return max_area

def maximalRectangle(matrix):
    if not matrix: return 0
    m, n = len(matrix), len(matrix[0])
    heights = [0] * n
    max_area = 0
    for i in range(m):
        for j in range(n):
            heights[j] = heights[j] + 1 if matrix[i][j] == '1' else 0
        max_area = max(max_area, largestRectangleArea(heights))
    return max_area

# 示例使用
matrix = [
    ["1", "0", "1", "0", "0"],
    ["1", "0", "1", "1", "1"],
    ["1", "1", "1", "1", "1"],
    ["1", "0", "0", "1", "0"]
]
print(maximalRectangle(matrix))  # 输出: 6

代码解释

  • largestRectangleArea 函数使用单调栈来计算给定高度数组的最大矩形面积。
  • maximalRectangle 函数处理矩阵的输入,并通过更新 heights 数组来计算每一行作为底部时的最大矩形面积。

结论

通过上述方法,我们可以有效地找到由1组成的最大矩形的面积。这种方法的时间复杂度为O(m * n),其中m是矩阵的行数,n是矩阵的列数。空间复杂度为O(n),用于存储高度数组。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。