题目描述:
给你一个下标从 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
。
示例:
输入:grid = [[0,1,1],[1,0,1],[0,0,1]] 输出:[[0,0,4],[0,0,4],[-2,-2,2]]
题目分析:
首先明白,本题需要返回一个二维数组,经过题目分析可以得出,可以将原数组进行操作后返回,不需要再创建一个新的二维数组。
本题精髓在于获取每行,每列对应的一或零的数量,所以需要遍历数组。遍历数组需要获取每行的长度与数组列的长度,所以当获取当每行的1的数量时,就可以用行的长度来推导出每行的零的数量。列也是同样的道理。
最后获取到题目要求的数据后再进行遍历数组,进行操作,最后输出。
java解法:
class Solution {
public int[][] onesMinusZeros(int[][] grid) {
int n = grid.length;//获取列的长的
int m = grid[0].length;//获取行的长度
int[] row = new int[n];//储存每行一的数量
int[] col = new int[m];//储存每列零的数量
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(grid[i][j] == 1){
row[i]++;//进行一的储存
}else{
col[j]++;//进行零的储存
}
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
grid[i][j] = 2 * row[i] - 2 * col[j] + n - m;//数据操作
}
}
return grid;/返回数组
}
}
代码分析:
row数组对应的题目数据就是onesRowi.
col数组对应的题目数据就是zerosColj.
代码区域n值:n = zerosColj + onesColj
m值:m = zerosRowi + onesRowi
所以代码中对应的操作:2 * row[i] - 2 * col[j] + n - m就等于题目中所要求的操作