行和列中一和零的差值

60 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

题目描述

给你一个下标从 0 开始的 m x n 二进制矩阵 grid 。

我们按照如下过程,定义一个下标从 0 开始的 m x n 差值矩阵 diff :

  • 令第 i 行一的数目为 onesRowi 。
  • 令第 j 列一的数目为 onesColj 。
  • 令第 i 行零的数目为 zerosRowi 。
  • 令第 j 列零的数目为 zerosColj 。
  • diff[i][j] = onesRowi + onesColj - zerosRowi - zerosColj

请你返回差值矩阵 **diff 。

示例 1:

输入: grid = [[0,1,1],[1,0,1],[0,0,1]]
输出: [[0,0,4],[0,0,4],[-2,-2,2]]
解释:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 2 + 1 - 1 - 2 = 0 
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 2 + 1 - 1 - 2 = 0 
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 2 + 3 - 1 - 0 = 4 
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 2 + 1 - 1 - 2 = 0 
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 2 + 1 - 1 - 2 = 0 
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 2 + 3 - 1 - 0 = 4 
- diff[2][0] = onesRow2 + onesCol0 - zerosRow2 - zerosCol0 = 1 + 1 - 2 - 2 = -2
- diff[2][1] = onesRow2 + onesCol1 - zerosRow2 - zerosCol1 = 1 + 1 - 2 - 2 = -2
- diff[2][2] = onesRow2 + onesCol2 - zerosRow2 - zerosCol2 = 1 + 3 - 2 - 0 = 2

示例 2:

输入: grid = [[1,1,1],[1,1,1]]
输出: [[5,5,5],[5,5,5]]
解释:
- diff[0][0] = onesRow0 + onesCol0 - zerosRow0 - zerosCol0 = 3 + 2 - 0 - 0 = 5
- diff[0][1] = onesRow0 + onesCol1 - zerosRow0 - zerosCol1 = 3 + 2 - 0 - 0 = 5
- diff[0][2] = onesRow0 + onesCol2 - zerosRow0 - zerosCol2 = 3 + 2 - 0 - 0 = 5
- diff[1][0] = onesRow1 + onesCol0 - zerosRow1 - zerosCol0 = 3 + 2 - 0 - 0 = 5
- diff[1][1] = onesRow1 + onesCol1 - zerosRow1 - zerosCol1 = 3 + 2 - 0 - 0 = 5
- diff[1][2] = onesRow1 + onesCol2 - zerosRow1 - zerosCol2 = 3 + 2 - 0 - 0 = 5

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 105
  • 1 <= m * n <= 105
  • grid[i][j] 要么是 0 ,要么是 1 。

解题思路

首先我们应该要先理解一下题意,题目给我们一个m x n 二进制矩阵 grid ,我们需要根据计算公式求出每一个位置的值:diff[i][j] = onesRowi + onesColj - zerosRowi - zerosColj,其中 onesRowi 为第 i 行1的数目; onesColj 为第 j 列1的数目; zerosRowi为 i 行0的数目; zerosColj 为第 j 列0的数目。
所以我们可以先算出每一行中1的个数和每一列中1的个数,行数和列数与行列中1的个数之差即为0的个数,然后进行遍历求值即可。

  • 求每一行列中1的个数
for(let i = 0; i < grid.length; i++){
    for(let j = 0; j < grid[i].length; j++){
        row[i] += grid[i][j];
        col[j] += grid[i][j];
    }
}
  • 通过公式求出diff数组,这里我定义为res
for(let i = 0; i < grid.length; i++){
    res[i] = new Array(grid[0].length).fill(0);
    for(let j = 0; j < grid[0].length; j++){
        res[i][j] = row[i]  + col[j] - (grid.length - row[i]) - (grid[0].length - col[j]);
    }
}

AC代码

完整AC代码如下:

/**
 * @param {number[][]} grid
 * @return {number[][]}
 */
var onesMinusZeros = function(grid) {
    const row = new Array(grid.length).fill(0),col = new Array(grid[0].length).fill(0);
    for(let i = 0; i < grid.length; i++){
        for(let j = 0; j < grid[i].length; j++){
            row[i] += grid[i][j];
            col[j] += grid[i][j];
        }
    }
    const res = new Array(grid.length);
    for(let i = 0; i < grid.length; i++){
        res[i] = new Array(grid[0].length).fill(0);
        for(let j = 0; j < grid[0].length; j++){
            res[i][j] = row[i]  + col[j] - (grid.length - row[i]) - (grid[0].length - col[j]);
        }
    }
    return res;
};

说在最后

本人为算法业余爱好者,如果上面分享有错误的地方,欢迎指出,感激不尽。