Java 中的矩阵中查找最大矩形

2025年1月7日 | 5 分钟阅读

在计算问题中,在二值矩阵中查找最大矩形是一个经典的测试动态规划和基于堆栈的方法理解的问题。这个问题经常出现在各种领域,例如图像处理、计算机视觉,甚至游戏开发。在本节中,我们将深入探讨一种使用 Java 解决此问题的有效算法。

问题定义

给定一个二值矩阵(仅包含 0 和 1 的矩阵),任务是找到包含仅 1 的最大矩形的面积。

例如,考虑以下二值矩阵

包含仅 1 的最大矩形的面积为 6。

方法

我们可以将问题分解为可以有效解决的更小子问题。以下是分步方法:

转换矩阵:将矩阵的每一行转换为直方图表示。

直方图中的最大矩形:使用基于堆栈的方法为每一行在直方图中找到最大矩形。

分步解决方案

1. 转换矩阵

思路是将每一行视为直方图的基准。对于矩阵中的每一行,如果元素是 1,则将其与上一行中它上方的元素值相加。这样,每一行将代表一个高度直方图。

考虑矩阵

转换将如下所示:

2. 直方图中的最大矩形

对于转换后的矩阵中的每一行,我们将使用基于堆栈的方法在直方图中找到最大矩形。

以下是查找直方图中最大矩形的逻辑:

初始化

  • 创建一个堆栈来存储直方图的索引。
  • 将 max_area 初始化为 0。

遍历直方图

对于直方图中的每个条形,如果堆栈为空或当前条形高于堆栈顶部索引处的条形,则将当前索引压入堆栈。

如果当前条形低于堆栈顶部索引处的条形,则弹出堆栈,并将该条形作为最小(或最低高度)条形来计算面积。如果新计算的面积更大,则更新 max_area。

在直方图结束时,弹出堆栈中所有剩余的条形,并像上面一样计算它们的面积。

算法

  1. 将“MAX_AREA”设置为 0。
  2. 初始化“PREVIOUS_ROW”和“RESULTANT_ROW”向量,大小为“TOTAL_COLUMNS”,值为 0。
  3. 对于“CURRENT_ROW”从 0 到“TOTAL_ROWS”,执行:
  4. 对于“CURRENT_COLUMN”从 0 到“TOTAL_COLUMNS”,执行:
    1. 如果 MATRIX[CURRENT_ROW][CURRENT_COLUMN] 不为 0,则:
      1. 设置 RESULTANT_ROW[CURRENT_COLUMN] = PREVIOUS_ROW[CURRENT_COLUMN] + MATRIX[CURRENT_ROW][CURRENT_COLUMN]
    2. 否则
      1. 设置 RESULTANT_ROW[CURRENT_COLUMN] = 0。
  5. 设置“CURRENT_MAX_AREA” = LARGEST_RECTANGLE(“RESULTANT_ROW”)。
  6. 设置“MAX_AREA” = max(“MAX_AREA”,“CURRENT_MAX_AREA”)。
  7. 设置“PREVIOUS_ROW” = “RESULTANT_ROW”。
  8. 返回“MAX_AREA”。

让我们在 Java 程序中实现上述方法。

实施

这是解决此问题的完整 Java 代码:

文件名:LargestRectangleInMatrix.java

输出

 
The area of the largest rectangle is: 6   

解释

maximalRectangle() 方法是计算二值矩阵中最大矩形的主要函数。我们初始化一个 height 数组来跟踪每列直方图的高度。我们遍历每一行并更新 heights 数组。如果矩阵中的当前元素是 '1',则将高度增加 1;否则,将高度重置为 0。对于每个更新的 heights 数组,我们使用 largestRectangleArea() 方法计算最大矩形面积。

largestRectangleArea() 方法计算由 heights 数组表示的直方图中的最大矩形。我们使用堆栈来存储 heights 数组的索引。

我们遍历 heights 数组,通过维护堆栈并在必要时弹出元素来计算最大矩形面积。

main 方法提供了一个示例矩阵,并打印最大矩形的面积。

复杂度分析

时间复杂度:算法的时间复杂度为 O(n×m),其中 n 是行数,m 是列数。因为我们一次遍历矩阵的每个元素,并且对于每一行,我们在 O(m) 时间内计算最大矩形面积。

空间复杂度:由于 heights 数组和堆栈使用的额外空间,空间复杂度为 O(m)。

结论

在二值矩阵中查找最大矩形是一个结合了动态规划和基于堆栈的技术元素的问题。通过将矩阵转换为一系列直方图,并应用基于堆栈的高效方法来查找每个直方图中的最大矩形,我们可以有效地解决此问题。提供的 Java 实现说明了这种方法,并且可以作为类似问题的参考。

理解和实现此算法可以增强一个人解决涉及多维数据结构和高级算法技术之类的复杂问题的能力。