解法一
不需要更新每个元素的值,只统计行和列被更新的记录。然后遍历整个矩阵,如果该单元格所在的行列被更新的次数之和为奇数,那么这一格的结果就是奇数。
class Solution {
public int oddCells(int n, int m, int[][] indices) {
int[] row = new int[n];
int[] col = new int[m];
for (int[] cell : indices) {
++row[cell[0]];
++col[cell[1]];
}
int ans = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if ((row[i] + col[j]) % 2 == 1) {
++ans;
}
}
}
return ans;
}
}
解法二
对解法一的改进,计算答案时分别统计行列被更新奇数次和偶数次的数量,然后被更新奇数次的行和被更更新偶数次的列,或者被更新偶数次的行和被更更新奇数次的列,以上两种组合对应的单元格上的值为奇数。
class Solution {
public int oddCells(int n, int m, int[][] indices) {
int[] row = new int[n];
int[] col = new int[m];
for (int[] cell : indices) {
++row[cell[0]];
++col[cell[1]];
}
int rowOdd = 0;
int rowEven = 0;
int colOdd = 0;
int colEven = 0;
for (int i = 0; i < n; ++i) {
if (row[i] % 2 == 0) {
++rowEven;
} else {
++rowOdd;
}
}
for (int i = 0; i < m; ++i) {
if (col[i] % 2 == 0) {
++colEven;
} else {
++colOdd;
}
}
return (rowEven * colOdd + rowOdd * colEven);
}
}