题目描述
给你一个 n
行 m
列的矩阵,最开始的时候,每个单元格中的值都是 0
。另有一个索引数组 indices
,indices[i] = [ri, ci]
中的 ri
和 ci
分别表示指定的行和列(从 0
开始编号)。你需要将每对 [ri, ci]
指定的行和列上的所有单元格的值加 1
。请你在执行完所有 indices
指定的增量操作后,返回矩阵中 「奇数值单元格」 的数目。
输入: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;
}
};