在 C++ 中查詢二進位制矩陣中 1 的數量最多的行號


在這個問題中,我們得到一個二進位制矩陣,其中每一行都是排序的。我們的任務是找到二進位制矩陣中 1 的數量最多的行號。

讓我們舉個例子來理解這個問題,

輸入

binMat[][] = {
   1, 1, 1, 1
   0, 0, 0, 0
   0, 0, 0, 1
   0, 0, 1, 1
}

輸出

1

解決方案方法

解決這個問題的一個簡單方法是計算每一行中 1 的總數。然後返回 1 計數最多的行號。

程式說明我們解決方案的工作原理,

示例

 即時演示

#include <iostream>
using namespace std;
#define R 4
#define C 4
int findMax1Row(bool mat[R][C]) {
   int max1Row = 0, max1Count = -1;
   int i, index;
   for (i = 0; i < R; i++) {
      int oneCount = 0;
      for(int j = 0; j < C; j++){
         if(mat[i][j])
            oneCount++;
      }
      if(oneCount > max1Count){
         max1Count = oneCount;
         max1Row = i;
      }
   }
   return (max1Row + 1);
}
int main() {
   bool mat[R][C] = {
      {0, 1, 1, 1},
      {0, 0, 1, 1},
      {0, 0, 0, 1},
      {0, 0, 0, 0}
   };
   cout<<"The number of row with maximum number of 1's is "<<findMax1Row(mat);
   return 0;
}

輸出

1 的數量最多的行號是 1。解決這個問題的一個更好的方法是在每一行上使用二分查詢來找到該行中第一個 1 的出現位置。該行中 1 的數量可以使用行大小 - 第一個 1 的索引來找到。使用此方法,我們可以找到每一行中 1 的數量,然後返回 1 數量最多的行。

程式說明我們解決方案的工作原理,

示例

 即時演示

#include <iostream>
using namespace std;
#define R 4
#define C 4
int binarySearch1Row(bool arr[], int start, int end) {
   if(end >= start) {
      int mid = start + (end - start)/2;
      if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
         return mid;
      else if (arr[mid] == 0)
         return binarySearch1Row(arr, (mid + 1), end);
      else
         return binarySearch1Row(arr, start, (mid -1));
   }
   return -1;
}
int findMax1Row(bool mat[R][C]) {
   int max1Row = 0, max1Count = -1;
   int i, index;
   for (i = 0; i < R; i++) {
      index = binarySearch1Row(mat[i], 0, C-1);
      if (index != -1 && ( C-index) > max1Count) {
         max1Count = C - index;
         max1Row = i;
      }
   }
   return (max1Row + 1);
}
int main() {
   bool mat[R][C] = {
      {0, 1, 1, 1},
      {0, 0, 1, 1},
      {0, 0, 0, 1},
      {0, 0, 0, 0}
   };
   cout<<"The number of row with maximum number of 1's is "<<findMax1Row(mat);
   return 0;
}

輸出

The number of row with maximum number of 1's is 1

對上述方法新增的最佳化可以檢查當前行是否比上一行具有更多的 1,使用第一個 1 的索引。如果它有更多的 1,則執行二分查詢,但從 0 到上一行中第一個 1 的索引。

這將節省計算 1 的數量的開銷,這些 1 的數量比當前行少。

程式說明我們解決方案的工作原理,

示例

 即時演示

#include <iostream>
using namespace std;
#define R 4
#define C 4
int binarySearch1Row(bool arr[], int start, int end) {
   if(end >= start) {
      int mid = start + (end - start)/2;
      if ( ( mid == 0 || arr[mid-1] == 0) && arr[mid] == 1)
         return mid;
      else if (arr[mid] == 0)
         return binarySearch1Row(arr, (mid + 1), end);
      else
         return binarySearch1Row(arr, start, (mid -1));
   }
   return -1;
}
int findMax1Row(bool mat[R][C]) {
   int i, index;
   int max1Row = 0;
   int max1Count = binarySearch1Row(mat[0], 0, C - 1);
   for (i = 1; i < R; i++){
      if (max1Count != -1 && mat[i][C - max1Count - 1] == 1) {
         index = binarySearch1Row (mat[i], 0, C - max1Count);
         if (index != -1 && C - index > max1Count) {
            max1Count = C - index;
            max1Row = i;
         }
      }
      else
      max1Count = binarySearch1Row(mat[i], 0, C - 1);
   }
   return (max1Row + 1);
}
int main() {
   bool mat[R][C] = {
      {0, 1, 1, 1},
      {0, 0, 0, 1},
      {0, 0, 1, 1},
      {0, 0, 0, 0}
   };
   cout<<"The number of row with maximum number of 1's is "<<findMax1Row(mat);
   return 0;
}

輸出

The number of row with maximum number of 1's is 1

更新於: 2021-03-16

127 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.