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 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告