主要考察预处理、对0的处理

使用行、列数组事先计算各行各列的乘积

使用标记数组标记好各行各列是否有0

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, m;
    while (cin >> n >> m) {
        vector<vector<int>> matrix(n, vector<int>(m, 0)); // 存储矩阵信息
        vector<long> multiX(n, 1), multiY(m, 1); // 存储每行每列相乘的结果
        vector<bool> zeroX(n, false), zeroY(m, false); // 标志每行每列是否有0
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> matrix[i][j];
                // 如果读入0,标记行列,同时修改该值为-1,并跳过此循环
                if (matrix[i][j] == 0) {
                    zeroX[i] = true;
                    zeroY[j] = true;
                    matrix[i][j] = -1;
                    continue;
                }
                // 计算行列相乘结果
                multiX[i] *= matrix[i][j];
                multiY[j] *= matrix[i][j];
            }
        }
        long maxMulti = 1; // 保留最大乘积
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 如果 行或列有0 并且 矩阵值不是-1(即原矩阵的0),跳过
                if ((zeroX[i] || zeroY[j]) && matrix[i][j] != -1) {
                    continue;
                }
                // 比较并更新最大乘积,注意要除以矩阵值的平方
                maxMulti = max(maxMulti, multiX[i] * multiY[j] / (matrix[i][j] * matrix[i][j]));
            }
        }
        cout << maxMulti << endl;
    }
    return 0;
}

时间复杂度:O(mn),用于遍历矩阵

空间复杂度:O(mn),用于存储矩阵