数组
矩阵
模拟
题目描述
给你一个下标从 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
。
解法
方法一:模拟
根据题意模拟即可。
时间复杂度 $O(m \times n)$,忽略答案的空间消耗,空间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
Python3 Java C++ Go TypeScript Rust C
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class Solution :
def onesMinusZeros ( self , grid : List [ List [ int ]]) -> List [ List [ int ]]:
m , n = len ( grid ), len ( grid [ 0 ])
rows = [ 0 ] * m
cols = [ 0 ] * n
for i , row in enumerate ( grid ):
for j , v in enumerate ( row ):
rows [ i ] += v
cols [ j ] += v
diff = [[ 0 ] * n for _ in range ( m )]
for i , r in enumerate ( rows ):
for j , c in enumerate ( cols ):
diff [ i ][ j ] = r + c - ( n - r ) - ( m - c )
return diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 class Solution {
public int [][] onesMinusZeros ( int [][] grid ) {
int m = grid . length , n = grid [ 0 ] . length ;
int [] rows = new int [ m ] ;
int [] cols = new int [ n ] ;
for ( int i = 0 ; i < m ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j ) {
int v = grid [ i ][ j ] ;
rows [ i ] += v ;
cols [ j ] += v ;
}
}
int [][] diff = new int [ m ][ n ] ;
for ( int i = 0 ; i < m ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j ) {
diff [ i ][ j ] = rows [ i ] + cols [ j ] - ( n - rows [ i ] ) - ( m - cols [ j ] );
}
}
return diff ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class Solution {
public :
vector < vector < int >> onesMinusZeros ( vector < vector < int >>& grid ) {
int m = grid . size (), n = grid [ 0 ]. size ();
vector < int > rows ( m );
vector < int > cols ( n );
for ( int i = 0 ; i < m ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j ) {
int v = grid [ i ][ j ];
rows [ i ] += v ;
cols [ j ] += v ;
}
}
vector < vector < int >> diff ( m , vector < int > ( n ));
for ( int i = 0 ; i < m ; ++ i ) {
for ( int j = 0 ; j < n ; ++ j ) {
diff [ i ][ j ] = rows [ i ] + cols [ j ] - ( n - rows [ i ]) - ( m - cols [ j ]);
}
}
return diff ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 func onesMinusZeros ( grid [][] int ) [][] int {
m , n := len ( grid ), len ( grid [ 0 ])
rows := make ([] int , m )
cols := make ([] int , n )
diff := make ([][] int , m )
for i , row := range grid {
diff [ i ] = make ([] int , n )
for j , v := range row {
rows [ i ] += v
cols [ j ] += v
}
}
for i , r := range rows {
for j , c := range cols {
diff [ i ][ j ] = r + c - ( n - r ) - ( m - c )
}
}
return diff
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 function onesMinusZeros ( grid : number [][]) : number [][] {
const m = grid . length ;
const n = grid [ 0 ]. length ;
const rows = new Array ( m ). fill ( 0 );
const cols = new Array ( n ). fill ( 0 );
for ( let i = 0 ; i < m ; i ++ ) {
for ( let j = 0 ; j < n ; j ++ ) {
if ( grid [ i ][ j ]) {
rows [ i ] ++ ;
cols [ j ] ++ ;
}
}
}
const ans = Array . from ({ length : m }, () => new Array ( n ). fill ( 0 ));
for ( let i = 0 ; i < m ; i ++ ) {
for ( let j = 0 ; j < n ; j ++ ) {
ans [ i ][ j ] = rows [ i ] + cols [ j ] - ( m - rows [ i ]) - ( n - cols [ j ]);
}
}
return ans ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 impl Solution {
pub fn ones_minus_zeros ( grid : Vec < Vec < i32 >> ) -> Vec < Vec < i32 >> {
let m = grid . len ();
let n = grid [ 0 ]. len ();
let mut rows = vec! [ 0 ; m ];
let mut cols = vec! [ 0 ; n ];
for i in 0 .. m {
for j in 0 .. n {
if grid [ i ][ j ] == 1 {
rows [ i ] += 1 ;
cols [ j ] += 1 ;
}
}
}
let mut ans = vec! [ vec! [ 0 ; n ]; m ];
for i in 0 .. m {
for j in 0 .. n {
ans [ i ][ j ] = ( rows [ i ] + cols [ j ] - ( m - rows [ i ]) - ( n - cols [ j ])) as i32 ;
}
}
ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 /**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int ** onesMinusZeros ( int ** grid , int gridSize , int * gridColSize , int * returnSize , int ** returnColumnSizes ) {
int * rows = malloc ( sizeof ( int ) * gridSize );
int * cols = malloc ( sizeof ( int ) * gridColSize [ 0 ]);
memset ( rows , 0 , sizeof ( int ) * gridSize );
memset ( cols , 0 , sizeof ( int ) * gridColSize [ 0 ]);
for ( int i = 0 ; i < gridSize ; i ++ ) {
for ( int j = 0 ; j < gridColSize [ 0 ]; j ++ ) {
if ( grid [ i ][ j ]) {
rows [ i ] ++ ;
cols [ j ] ++ ;
}
}
}
int ** ans = malloc ( sizeof ( int * ) * gridSize );
for ( int i = 0 ; i < gridSize ; i ++ ) {
ans [ i ] = malloc ( sizeof ( int ) * gridColSize [ 0 ]);
for ( int j = 0 ; j < gridColSize [ 0 ]; j ++ ) {
ans [ i ][ j ] = rows [ i ] + cols [ j ] - ( gridSize - rows [ i ]) - ( gridColSize [ 0 ] - cols [ j ]);
}
}
* returnSize = gridSize ;
* returnColumnSizes = gridColSize ;
return ans ;
}
GitHub