题目描述
给你一个 n 行 m 列的矩阵,最开始的时候,每个单元格中的值都是 0。另有一个索引数组 indices,indices[i] = [ri, ci] 中的 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。你需要将每对 [ri, ci] 指定的行和列上的所有单元格的值加 1。请你在执行完所有 indices 指定的增量操作后,返回矩阵中 「奇数值单元格」 的数目。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KeTlMTZm-1577818158725)(./imgs/20200101023754.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/f13da893d67c55fc59a850c6afb89a32.png)
输入:n = 2, m = 3, indices = [[0,1],[1,1]]
输出:6
解题思路
最暴力的思路是模拟法,用一个二维矩阵去模拟题目中的操作,最后再统计奇数值的个数。(太暴力)
- 计数法:利用两个一维数组
rows[n]和cols[m]记录indices中行和列出项的次数,然后对于i行j列的元素rows[i] + cols[j],判断其是否为奇数。
参考代码
class Solution {
public:
int oddCells(int n, int m, vector<vector<int>>& indices) {
if(n <= 0 || m <= 0 || indices.size() == 0)
return 0;
int rows[n]; memset(rows, 0, sizeof(rows));
int cols[m]; memset(cols, 0, sizeof(cols));
for(auto elem: indices){
rows[elem[0]]++;
cols[elem[1]]++;
}
int ans = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if((rows[i] + cols[j]) & 1)
ans++;
}
}
return ans;
}
};
本文介绍了一种高效算法,用于计算经过特定操作后,矩阵中奇数值单元格的数量。通过记录行和列的增减次数,避免了直接模拟操作的高复杂度,实现了快速准确的统计。
277

被折叠的 条评论
为什么被折叠?



