解法一
不需要更新每个元素的值,只统计行和列被更新的记录。然后遍历整个矩阵,如果该单元格所在的行列被更新的次数之和为奇数,那么这一格的结果就是奇数。
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);}}
