題目描述
給你一個 n 行 m 列的矩陣,最開始的時候,每個單元格中的值都是 0。
另有一個索引數組 indices,indices[i] = [ri, ci] 中的 ri 和 ci 分別表示指定的行和列(從 0 開始編號)。
你需要將每對 [ri, ci] 指定的行和列上的所有單元格的值加 1。
請你在執行完所有 indices 指定的增量操作後,返回矩陣中 「奇數值單元格」 的數目。
示例 1:
輸入:n = 2, m = 3, indices = [[0,1],[1,1]]
輸出:6
解釋:最開始的矩陣是 [[0,0,0],[0,0,0]]。
第一次增量操作後得到 [[1,2,1],[0,1,0]]。
最後的矩陣是 [[1,3,1],[1,3,1]],裏面有 6 個奇數。
示例 2:
輸入:n = 2, m = 2, indices = [[1,1],[0,0]]
輸出:0
解釋:最後的矩陣是 [[2,2],[2,2]],裏面沒有奇數。
提示:
- 1 <= n <= 50
- 1 <= m <= 50
- 1 <= indices.length <= 100
- 0 <= indices[i][0] < n
- 0 <= indices[i][1] < m
解法
由題目可知,n
行 m
列的二維數組,每一行的增量操作會影響 m
個元素,每一列的增量操作會影響 n
個元素,因爲最終要計算的是奇數的個數,而初始數值爲偶數,所以不妨計算元素的增量操作次數即可,若爲奇數次,則元素最終爲奇數。
因爲每次操作都是直接影響一行或者一列元素,所以不妨計算最終影響了多少行元素,與多少列元素。相乘再相加,即得出最終影響的個數,因爲行列相遇相當於不操作,所以最後去除多加的元素數。
對同一行或同一列執行兩次操作相當於不執行操作
class Solution:
def oddCells(self, n: int, m: int, indices: List[List[int]]) -> int:
rset,cset=set(),set()
for r,c in indices:
if r in rset:
rset.remove(r)
else:
rset.add(r)
if c in cset:
cset.remove(c)
else:
cset.add(c)
rnum,cnum=len(rset),len(cset)
return rnum*m+cnum*n-2*rnum*cnum