C++程式中,求解1的個數比0的個數多一的最大子矩陣面積


在這個問題中,我們得到一個大小為nXn的二維矩陣,其中包含二進位制數字(0/1)。我們的任務是建立一個程式來查詢1的個數比0的個數多一的最大子矩陣面積。

讓我們透過一個例子來理解這個問題:

輸入

bin[N][N] = {
   {0, 1, 0, 0},
   {1, 1, 0, 0},
   {1, 0, 1, 1},
   {0, 1, 0, 1}
}

輸出

9

解釋

submatrix :
bin[1][0], bin[1][1], bin[1][2]
bin[2][0], bin[2][1], bin[2][2]
bin[3][0], bin[3][1], bin[3][2]
is the largest subarray with more 1’s one more than 0’s.
Number of 0’s = 4
Number of 1’s = 5

解決方案方法

一個簡單的方法是從矩陣中找到所有可能的子矩陣,然後返回所有子矩陣中的最大面積。

這種方法易於思考和實現,但是需要花費大量時間,並且需要巢狀迴圈,這使得時間複雜度為O(n^4)。因此,讓我們討論一種更有效的方法。

這裡的主要思想是固定矩陣的左列和右列,然後找到0的個數比1的個數多一的最大子陣列。我們將計算每一行的和,然後累加。為了找到1的個數比0的個數多一的最大面積。

示例

程式演示了我們解決方案的工作原理:

線上演示

#include <bits/stdc++.h>
using namespace std;
#define SIZE 10
int lenOfLongSubarr(int row[], int n, int& startInd, int& finishInd){
   unordered_map<int, int> subArr;
   int sumVal = 0, maxSubArrLen = 0;
   for (int i = 0; i < n; i++) {
      sumVal += row[i];
      if (sumVal == 1) {
         startInd = 0;
         finishInd = i;
         maxSubArrLen = i + 1;
      }
      else if (subArr.find(sumVal) == subArr.end())
         subArr[sumVal] = i;
      if (subArr.find(sumVal − 1) != subArr.end()) {
         int currLen = (i − subArr[sumVal − 1]);
         if (maxSubArrLen < currLen)
            startInd = subArr[sumVal − 1] + 1;
         finishInd = i;
         maxSubArrLen = currLen;
      }
   }
   return maxSubArrLen;
}
int largestSubmatrix(int bin[SIZE][SIZE], int n){
   int rows[n], maxSubMatArea = 0, currArea, longLen, startInd,
   finishInd;
   for (int left = 0; left < n; left++) {
      memset(rows, 0, sizeof(rows));
      for (int right = left; right < n; right++) {
         for (int i = 0; i < n; ++i){
            if(bin[i][right] == 0)
               rows[i] −= 1;
            else
               rows[i] += 1;
         }
         longLen = lenOfLongSubarr(rows, n, startInd, finishInd);
         currArea = (finishInd − startInd + 1) * (right − left + 1);
         if ((longLen != 0) && (maxSubMatArea < currArea)) {
            maxSubMatArea = currArea;
         }
      }
   }
   return maxSubMatArea;
}
int main(){
   int bin[SIZE][SIZE] = {
      { 1, 0, 0, 1 },
      { 0, 1, 1, 1 },
      { 1, 0, 0, 0 },
      { 0, 1, 0, 1 }
   };
   int n = 4;
   cout<<"The maximum sub−matrix area having count of 1’s one more
   than count of 0’s is "<<largestSubmatrix(bin, n);
   return 0;
}

輸出

The maximum sub-matrix area having count of 1’s one more than count of
0’s is 9

更新於:2020年12月9日

83 次檢視

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.