📜  1 和 0 数量相等的最大面积矩形子矩阵

📅  最后修改于: 2021-09-22 09:47:09             🧑  作者: Mango

给定一个二元矩阵。问题是找到具有相同数量的 1 和 0 的最大面积矩形子矩阵。

例子:

Input : mat[][] = { {0, 0, 1, 1},
                    {0, 1, 1, 0},
                    {1, 1, 1, 0},
                    {1, 0, 0, 1} }
Output : 8 sq. units
(Top, left): (0, 0)
(Bottom, right): (3, 1)

Input : mat[][] = { {0, 0, 1, 1},
                    {0, 1, 1, 1} }            
Output : 6 sq. units

这个问题的简单解决方案是通过计算该矩形中 1 和 0 的总数来检查给定二维数组中的每个可能的矩形。该解决方案需要 4 个嵌套循环,并且该解决方案的时间复杂度为 O(n^4)。

一个有效的解决方案是基于最大的矩形子矩阵,其总和为 0,这将时间复杂度降低到 O(n^3)。首先将矩阵中的每个“0”视为“-1”。现在,我们的想法是将问题简化为一维数组。我们将左右列一一固定,并为每个左右列对找到具有 0 和连续行的最大子数组。我们基本上找到每个固定的左右列对的顶部和底部行号(总和为零)。要找到顶部和底部的行号,从左到右计算每行元素的总和,并将这些总和存储在一个数组中,比如 temp[]。所以 temp[i] 表示第 i 行从左到右的元素总和。如果在 temp[] 中找到 sum 为 0 的最大子数组,我们可以得到 sum 为 0 的矩形子矩阵的索引位置(即 1 和 0 的个数相等)。通过这个过程,我们可以找到最大面积的矩形子矩阵,其总和等于 0(即 1 和 0 的数量相等)。我们可以使用哈希技术在 O(n) 时间内在一维数组中找到总和等于 0 的最大长度子数组。

// C++ implementation to find largest area rectangular
// submatrix with equal number of 1's and 0's
#include 
  
using namespace std;
  
#define MAX_ROW 10
#define MAX_COL 10
  
// This function basically finds largest 0
// sum subarray in arr[0..n-1]. If 0 sum
// does't exist, then it returns false. Else
// it returns true and sets starting and
// ending indexes as start and end.
bool subArrWithSumZero(int arr[], int &start, 
                              int &end, int n)
{
    // to store cumulative sum
    int sum[n];
      
    // Initialize all elements of sum[] to 0
    memset(sum, 0, sizeof(sum));
      
    // map to store the indexes of sum
    unordered_map um;
      
    // build up the cumulative sum[] array
    sum[0] = arr[0];
    for (int i=1; i

输出:

(Top, Left): (0, 0)
(Bottom, Right): (3, 1)
Area: 8 sq.units

时间复杂度:O(n 3 )
辅助空间:O(n)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。