一个矩阵仅包含0或1,求由1组成的最大矩阵面积
【摘要】 要解决寻找由1组成的最大矩阵面积的问题,可以采用动态规划(Dynamic Programming, DP)的方法。以下是详细的解决方案及其步骤: 问题背景给定一个二维矩阵 matrix,矩阵中每个元素都是0或1。目标是找到一个由1组成的最大矩形的面积。 解决步骤理解问题每个1可以作为矩形的一个边界,需要找到以这些1为边界的最大矩形。转换问题将问题转换为计算每个位置作为矩形底部时的最大高度,然...
要解决寻找由1组成的最大矩阵面积的问题,可以采用动态规划(Dynamic Programming, DP)的方法。以下是详细的解决方案及其步骤:
问题背景
给定一个二维矩阵 matrix
,矩阵中每个元素都是0或1。目标是找到一个由1组成的最大矩形的面积。
解决步骤
-
理解问题
- 每个1可以作为矩形的一个边界,需要找到以这些1为边界的最大矩形。
-
转换问题
- 将问题转换为计算每个位置作为矩形底部时的最大高度,然后利用这些高度计算最大的矩形面积。
-
动态规划思路
- 对于每一行,计算从该行到矩阵顶部(或上一行的底部)连续1的长度。这将给出该行每一个位置作为矩形底部时的高度。
- 使用这些高度,计算从该行开始向上的最大矩形面积。
-
实现细节
- 初始化一个与矩阵同高的
heights
数组,用于记录每个位置的连续1的长度。 - 遍历矩阵的每一行,更新
heights
数组。 - 对于每一行,使用一个辅助函数(如
largestRectangleArea
)来找到这一行作为底部时最大矩形的面积。 - 跟踪所有行作为底部时最大面积的最大值。
- 初始化一个与矩阵同高的
-
辅助函数 - 计算最大矩形面积
- 使用单调栈(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)