Description
There is an m x n matrix that is initialized to all 0's. There is also a 2D array indices where each indices[i] = [ri, ci] represents a 0-indexed location to perform some increment operations on the matrix.
For each location indices[i], do both of the following:
- Increment all the cells on row
ri. - Increment all the cells on column
ci.
Given m, n, and indices, return the number of odd-valued cells in the matrix after applying the increment to all locations in indices.
Example 1:
Input: m = 2, n = 3, indices = [[0,1],[1,1]] Output: 6 Explanation: Initial matrix = [[0,0,0],[0,0,0]]. After applying first increment it becomes [[1,2,1],[0,1,0]]. The final matrix is [[1,3,1],[1,3,1]], which contains 6 odd numbers.
Example 2:
Input: m = 2, n = 2, indices = [[1,1],[0,0]] Output: 0 Explanation: Final matrix = [[2,2],[2,2]]. There are no odd numbers in the final matrix.
Constraints:
1 <= m, n <= 501 <= indices.length <= 1000 <= ri < m0 <= ci < n
Follow up: Could you solve this in O(n + m + indices.length) time with only O(n + m) extra space?
Solutions
Solution 1: Simulation
We create a matrix g to store the result of operations. For each pair (ri, ci) in indices, we add 1 to all numbers in the ri-th row of the matrix and add 1 to all elements in the ci-th column.
After the simulation ends, we traverse the matrix and count the number of odd numbers.
The time complexity is O(k × (m + n) + m × n), and the space complexity is O(m × n). Here, k is the length of indices.
class Solution: def oddCells(self, m: int, n: int, indices: List[List[int]]) -> int: g = [[0] * n for _ in range(m)] for r, c in indices: for i in range(m): g[i][c] += 1 for j in range(n): g[r][j] += 1 return sum(v % 2 for row in g for v in row)(code-box)
Solution 2: Space Optimization
We can use a row array row and a column array col to record the number of times each row and column is incremented. For each pair (ri, ci) in indices, we add 1 to row[ri] and col[ci] respectively.
After the operations are completed, the count at position (i, j) can be calculated as row[i] + col[j]. We traverse the matrix and count the number of odd numbers.
The time complexity is O(k + m × n), and the space complexity is O(m + n). Here, k is the length of indices.
class Solution: def oddCells(self, m: int, n: int, indices: List[List[int]]) -> int: row = [0] * m col = [0] * n for r, c in indices: row[r] += 1 col[c] += 1 return sum((i + j) % 2 for i in row for j in col)(code-box)
Solution 3: Mathematical Optimization
We notice that a number at position (i, j) in the matrix will be odd only when exactly one of row[i] and col[j] is odd and the other is even.
We count the number of odd numbers in row, denoted as cnt1, and the number of odd numbers in col, denoted as cnt2. Therefore, the final count of odd numbers is cnt1 × (n - cnt2) + cnt2 × (m - cnt1).
The time complexity is O(k + m + n), and the space complexity is O(m + n). Here, k is the length of indices.
class Solution: def oddCells(self, m: int, n: int, indices: List[List[int]]) -> int: row = [0] * m col = [0] * n for r, c in indices: row[r] += 1 col[c] += 1 cnt1 = sum(v % 2 for v in row) cnt2 = sum(v % 2 for v in col) return cnt1 * (n - cnt2) + cnt2 * (m - cnt1)(code-box)
