解法一

不需要更新每个元素的值,只统计行和列被更新的记录。然后遍历整个矩阵,如果该单元格所在的行列被更新的次数之和为奇数,那么这一格的结果就是奇数。

  1. class Solution {
  2. public int oddCells(int n, int m, int[][] indices) {
  3. int[] row = new int[n];
  4. int[] col = new int[m];
  5. for (int[] cell : indices) {
  6. ++row[cell[0]];
  7. ++col[cell[1]];
  8. }
  9. int ans = 0;
  10. for (int i = 0; i < n; ++i) {
  11. for (int j = 0; j < m; ++j) {
  12. if ((row[i] + col[j]) % 2 == 1) {
  13. ++ans;
  14. }
  15. }
  16. }
  17. return ans;
  18. }
  19. }

解法二

对解法一的改进,计算答案时分别统计行列被更新奇数次和偶数次的数量,然后被更新奇数次的行和被更更新偶数次的列,或者被更新偶数次的行和被更更新奇数次的列,以上两种组合对应的单元格上的值为奇数。

  1. class Solution {
  2. public int oddCells(int n, int m, int[][] indices) {
  3. int[] row = new int[n];
  4. int[] col = new int[m];
  5. for (int[] cell : indices) {
  6. ++row[cell[0]];
  7. ++col[cell[1]];
  8. }
  9. int rowOdd = 0;
  10. int rowEven = 0;
  11. int colOdd = 0;
  12. int colEven = 0;
  13. for (int i = 0; i < n; ++i) {
  14. if (row[i] % 2 == 0) {
  15. ++rowEven;
  16. } else {
  17. ++rowOdd;
  18. }
  19. }
  20. for (int i = 0; i < m; ++i) {
  21. if (col[i] % 2 == 0) {
  22. ++colEven;
  23. } else {
  24. ++colOdd;
  25. }
  26. }
  27. return (rowEven * colOdd + rowOdd * colEven);
  28. }
  29. }