Leetcode 1252. 奇數值單元格的數目

題目描述

給你一個 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

解法

由題目可知,nm 列的二維數組,每一行的增量操作會影響 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章