【leetcode】3033.修改矩阵

42 阅读1分钟

leetcode-3033.png

不需要头脑的一题,比较耿直 用一个数组maxCol存下每一列的最大值,然后遍历数组,碰到-1就直接把这一列最大值放上去

var modifiedMatrix = function (matrix) {
    let row = matrix.length
    let col = matrix[0].length
    let res = matrix
    let maxCol = new Array(col).fill(0)
    for (let i = 0; i < col; ++i) {
        let res = 0
        for (let j = 0; j < row; ++j) {
            res = Math.max(res, matrix[j][i])
            maxCol[i] = res
        }
    }
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (matrix[i][j] === -1) {
                res[i][j] = maxCol[j]
            }
        }
    }
    return res
};

上面存在一些小问题,拷贝数组应该是深拷贝
然后找每一列的最大值应该用Infinity比较好点,需要在循环外面进行赋值(其实也没必要用maxVal这个中间量) 优化代码

var modifiedMatrix = function(matrix) {
    let row = matrix.length;
    let col = matrix[0].length;
    let res = JSON.parse(JSON.stringify(matrix)); // 深拷贝原始矩阵
    let maxCol = new Array(col).fill(0);

    // 找到每一列的最大值
    for (let i = 0; i < col; ++i) {
        let maxVal = -Infinity;
        for (let j = 0; j < row; ++j) {
            maxVal = Math.max(maxVal, matrix[j][i]);
        }
        maxCol[i] = maxVal;
    }

    // 替换矩阵中的 -1 为该列的最大值
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (matrix[i][j] === -1) {
                res[i][j] = maxCol[j];
            }
        }
    }

    return res;
};

继续优化

var modifiedMatrix = function(matrix) {
    let row = matrix.length;
    let col = matrix[0].length;
    let maxCol = new Array(col).fill(-Infinity);

    // 找到每一列的最大值
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (matrix[i][j] !== -1) {
                maxCol[j] = Math.max(maxCol[j], matrix[i][j]);
            }
        }
    }

    // 创建结果矩阵并替换矩阵中的 -1 为该列的最大值
    let res = matrix.map((r, i) => 
        r.map((val, j) => val === -1 ? maxCol[j] : val)
    );

    return res;
};