C++ 中 1 的最大數量


假設我們有一個維度為 w x h 的矩陣 M,其中每個單元格的值為 0 或 1,並且 M 的任何大小為 l x l 的正方形子矩陣最多有 maxOnes 個 1。我們需要找到矩陣 M 可以具有的 1 的最大可能數量。

因此,如果輸入類似於 w = 3,h = 3,l = 2,maxOnes = 1,則輸出將為 4,因為在 3*3 矩陣中,沒有 2*2 子矩陣可以具有超過 1 個 1。具有 4 個 1 的最佳解決方案是 -

101
000
101

為了解決這個問題,我們將遵循以下步驟 -

  • ret := 0

  • 建立一個大小為 n x n 的二維陣列 sq

  • 初始化 i := 0,當 i < height 時,更新(i 增加 1),執行 -

    • 初始化 j := 0,當 j < width 時,更新(j 增加 1),執行 -

      • 將 sq[i mod n, j mod n] 增加 1

  • 定義一個數組 v

  • 初始化 i := 0,當 i < n 時,更新(i 增加 1),執行 -

    • 初始化 j := 0,當 j < n 時,更新(j 增加 1),執行 -

      • 將 sq[i, j] 插入到 v 的末尾

  • 將陣列 v 按降序排序

  • 初始化 i := 0,j := 0,當 i < v 的大小且 j < maxOnes 時,更新(i 增加 1),(j 增加 1),執行 -

  • 返回 ret

讓我們看看以下實現以更好地理解 -

示例

 線上演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maximumNumberOfOnes(int width, int height, int n, int maxOnes) {
      int ret = 0;
      vector < vector <int> > sq(n, vector <int>(n));
      for(int i = 0; i < height; i++){
         for(int j = 0; j < width; j++){
            sq[i % n][j % n]++;
         }
      }
      vector <int> v;
      for(int i = 0; i < n; i++){
         for(int j = 0; j < n ; j++){
            v.push_back(sq[i][j]);
         }
      }
      sort(v.rbegin(), v.rend());
      for(int i = 0, j = 0; i < v.size() && j < maxOnes; i++, j++){
         ret += v[i];
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.maximumNumberOfOnes(3,3,2,1));
}

輸入

3, 3, 2, 1

輸出

4

更新於: 2020-07-11

96 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告