返回

LeetCode 奇数值单元格的数目 Java 题解:步步深入,轻松破解!

后端







## LeetCode 1252. 奇数值单元格的数目

### 题目

给你一个 m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。

另有一个二维索引数组 indices,indices[i] = [ri, ci] 指向矩阵中的一个单元格,你需要将位于 (ri, ci) 的单元格的值加上 1。

返回在执行所有操作后,矩阵中奇数值单元格的数目。

### 示例

```java
示例 1:

输入:m = 2, n = 3, indices = [[0,1],[1,1]]
输出:6
解释:最开始的矩阵是 [[0,0,0],[0,0,0]]。
第一次操作后,矩阵变成 [[0,1,0],[0,1,0]]。
第二次操作后,矩阵变成 [[0,2,0],[0,2,0]]。
由于有 6 个奇数值单元格,所以返回 6
示例 2:

输入:m = 1, n = 2, indices = [[0,1]]
输出:2

思路分析

这道题目的核心在于如何高效地计算奇数值单元格的数量。我们可以利用索引数组来进行优化,避免遍历整个矩阵。具体思路如下:

  1. 初始化一个与给定矩阵相同大小的二维数组,记为 count。其中,count[i][j] 表示矩阵中第 i 行第 j 列单元格的值。
  2. 对于索引数组中的每个索引 [ri, ci],将 count[ri][ci] 的值增加 1
  3. 遍历整个 count 数组,统计其中奇数值的个数即可。

Java 代码

class Solution {
    public int oddCells(int m, int n, int[][] indices) {
        // 初始化二维数组
        int[][] count = new int[m][n];

        // 统计索引数组中的奇数值单元格数量
        for (int[] index : indices) {
            int row = index[0];
            int col = index[1];
            for (int i = 0; i < m; i++) {
                count[i][col]++;
            }
            for (int j = 0; j < n; j++) {
                count[row][j]++;
            }
        }

        // 统计奇数值单元格的数量
        int oddCount = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (count[i][j] % 2 == 1) {
                    oddCount++;
                }
            }
        }

        return oddCount;
    }
}

复杂度分析

  • 时间复杂度:O(m * n + k),其中 m 为矩阵的行数,n 为矩阵的列数,k 为索引数组的长度。
  • 空间复杂度:O(m * n),因为我们使用了一个与矩阵相同大小的二维数组来存储单元格的值。

结语

这道题目的难点在于如何高效地计算奇数值单元格的数量。通过利用索引数组,我们可以避免遍历整个矩阵,从而降低时间复杂度。希望这篇题解能够帮助你更好地理解这道题目的解法。