C++ 翻转矩阵前传


假设我们有一个二进制矩阵。如果我们翻转一行然后翻转一列,我们需要找到可以获得的最大 1 的数量。

因此,如果输入类似于

101
010
100

则输出将为 8

为了解决这个问题,我们将遵循以下步骤:

  • n := 矩阵中行的数量

  • m := 矩阵中列的数量

  • ret := 0

  • 定义一个大小为 n 的数组 row

  • 定义一个大小为 n 的数组 col

  • total := 0

  • 对于初始化 i := 0,当 i < n 时,更新(i 增加 1),执行:

    • 对于初始化 j := 0,当 j < m 时,更新(j 增加 1),执行:

      • row[i] := row[i] + matrix[i, j]

      • col[j] := col[j] + matrix[i, j]

      • total := total + matrix[i, j]

  • 对于初始化 i := 0,当 i < n 时,更新(i 增加 1),执行:

    • 对于初始化 j := 0,当 j < m 时,更新(j 增加 1),执行:

      • cand := total - row[i] - col[j] + ((m - row[i]) + (n - col[j]))

      • 如果 matrix[i, j] 不为零,则:

        • cand := cand + 2

      • 否则

        • cand := cand - 2

      • ret := ret 和 cand 的最大值

  • 返回 ret

让我们看看以下实现以更好地理解:

示例

实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<vector<int>> &matrix) {
      int n = matrix.size();
      int m = matrix[0].size();
      int ret = 0;
      vector<int> row(n);
      vector<int> col(m);
      int total = 0;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            row[i] += matrix[i][j];
            col[j] += matrix[i][j];
            total += matrix[i][j];
         }
      }
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            int cand = total - row[i] - col[j] + (m - row[i]) + (n -
            col[j]);
            if (matrix[i][j]) {
               cand += 2;
            }else {
               cand -= 2;
            }
            ret = max(ret, cand);
         }
      }
      return ret;
   }
};
main() {
   Solution ob;
   vector<vector<int>> v = {{1,0,1},{0,1,0},{1,0,0}};
   cout << (ob.solve(v));
}

输入

{{1,0,1},{0,1,0},{1,0,0}}

输出

8

更新于: 2020年9月2日

225 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告