📜  最大面积的矩形子矩阵,具有等于1和0的数量

📅  最后修改于: 2021-05-07 08:03:59             🧑  作者: 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的总数来检查给定2D数组中的每个可能的矩形。此解决方案需要4个嵌套循环,并且此解决方案的时间复杂度为O(n ^ 4)。

一个有效的解决方案基于最大和子为0的最大矩形子矩阵,从而将时间复杂度降低到O(n ^ 3)。首先,将矩阵中的每个“ 0”视为“ -1”。现在,想法是将问题减少到一维阵列。我们一一固定左列和右列,并为每个左列和右列对找到最大有0个连续行的子数组。我们基本上为每个固定的左右列对找到顶部和底部的行号(总和为零)。要找到顶部和底部的行号,请从左到右计算每行中的元素总和,并将这些总和存储在一个名为temp []的数组中。因此,temp [i]表示第i行中从左到右的元素总和。如果我们在temp []中找到总和为0的最大子数组,则可以得到总和等于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)