返回
LeetCode 奇数值单元格的数目 Java 题解:步步深入,轻松破解!
后端
2024-01-19 13:31:04
## 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
思路分析
这道题目的核心在于如何高效地计算奇数值单元格的数量。我们可以利用索引数组来进行优化,避免遍历整个矩阵。具体思路如下:
- 初始化一个与给定矩阵相同大小的二维数组,记为
count
。其中,count[i][j]
表示矩阵中第i
行第j
列单元格的值。 - 对于索引数组中的每个索引
[ri, ci]
,将count[ri][ci]
的值增加1
。 - 遍历整个
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),因为我们使用了一个与矩阵相同大小的二维数组来存储单元格的值。
结语
这道题目的难点在于如何高效地计算奇数值单元格的数量。通过利用索引数组,我们可以避免遍历整个矩阵,从而降低时间复杂度。希望这篇题解能够帮助你更好地理解这道题目的解法。