Welcome to Subscribe On Youtube
2768. Number of Black Blocks
Description
You are given two integers m
and n
representing the dimensions of a 0-indexed m x n
grid.
You are also given a 0-indexed 2D integer matrix coordinates
, where coordinates[i] = [x, y]
indicates that the cell with coordinates [x, y]
is colored black. All cells in the grid that do not appear in coordinates
are white.
A block is defined as a 2 x 2
submatrix of the grid. More formally, a block with cell [x, y]
as its top-left corner where 0 <= x < m - 1
and 0 <= y < n - 1
contains the coordinates [x, y]
, [x + 1, y]
, [x, y + 1]
, and [x + 1, y + 1]
.
Return a 0-indexed integer array arr
of size 5
such that arr[i]
is the number of blocks that contains exactly i
black cells.
Example 1:
Input: m = 3, n = 3, coordinates = [[0,0]] Output: [3,1,0,0,0] Explanation: The grid looks like this: There is only 1 block with one black cell, and it is the block starting with cell [0,0]. The other 3 blocks start with cells [0,1], [1,0] and [1,1]. They all have zero black cells. Thus, we return [3,1,0,0,0].
Example 2:
Input: m = 3, n = 3, coordinates = [[0,0],[1,1],[0,2]] Output: [0,2,2,0,0] Explanation: The grid looks like this: There are 2 blocks with two black cells (the ones starting with cell coordinates [0,0] and [0,1]). The other 2 blocks have starting cell coordinates of [1,0] and [1,1]. They both have 1 black cell. Therefore, we return [0,2,2,0,0].
Constraints:
2 <= m <= 105
2 <= n <= 105
0 <= coordinates.length <= 104
coordinates[i].length == 2
0 <= coordinates[i][0] < m
0 <= coordinates[i][1] < n
- It is guaranteed that
coordinates
contains pairwise distinct coordinates.
Solutions
Solution 1: Hash Table
For each $2 \times 2$ submatrix, we can use its upper-left corner coordinate $(x, y)$ to represent it.
For each black cell $(x, y)$, its contribution to the 4 submatrices is $1$, namely the matrices $(x - 1, y - 1)$, $(x - 1, y)$, $(x, y - 1)$, $(x, y)$.
Therefore, we traverse all the black cells, and then accumulate the number of black cells in each submatrix, recorded in the hash table $cnt$.
Finally, we traverse all the values in $cnt$ (greater than $0$), count the number of times they appear, and record them in the answer array $ans$, while $ans[0]$ represents the number of submatrices without black cells, the value is $(m - 1) \times (n - 1) - \sum_{i = 1}^4 ans[i]$.
Time complexity $O(l)$, space complexity $O(l)$, where $l$ is the length of $coordinates$.
-
class Solution { public long[] countBlackBlocks(int m, int n, int[][] coordinates) { Map<Long, Integer> cnt = new HashMap<>(coordinates.length); int[] dirs = {0, 0, -1, -1, 0}; for (var e : coordinates) { int x = e[0], y = e[1]; for (int k = 0; k < 4; ++k) { int i = x + dirs[k], j = y + dirs[k + 1]; if (i >= 0 && i < m - 1 && j >= 0 && j < n - 1) { cnt.merge(1L * i * n + j, 1, Integer::sum); } } } long[] ans = new long[5]; ans[0] = (m - 1L) * (n - 1); for (int x : cnt.values()) { ++ans[x]; --ans[0]; } return ans; } }
-
class Solution { public: vector<long long> countBlackBlocks(int m, int n, vector<vector<int>>& coordinates) { unordered_map<long long, int> cnt; int dirs[5] = {0, 0, -1, -1, 0}; for (auto& e : coordinates) { int x = e[0], y = e[1]; for (int k = 0; k < 4; ++k) { int i = x + dirs[k], j = y + dirs[k + 1]; if (i >= 0 && i < m - 1 && j >= 0 && j < n - 1) { ++cnt[1LL * i * n + j]; } } } vector<long long> ans(5); ans[0] = (m - 1LL) * (n - 1); for (auto& [_, x] : cnt) { ++ans[x]; --ans[0]; } return ans; } };
-
class Solution: def countBlackBlocks( self, m: int, n: int, coordinates: List[List[int]] ) -> List[int]: cnt = Counter() for x, y in coordinates: for a, b in pairwise((0, 0, -1, -1, 0)): i, j = x + a, y + b if 0 <= i < m - 1 and 0 <= j < n - 1: cnt[(i, j)] += 1 ans = [0] * 5 for x in cnt.values(): ans[x] += 1 ans[0] = (m - 1) * (n - 1) - len(cnt.values()) return ans
-
func countBlackBlocks(m int, n int, coordinates [][]int) []int64 { cnt := map[int64]int{} dirs := [5]int{0, 0, -1, -1, 0} for _, e := range coordinates { x, y := e[0], e[1] for k := 0; k < 4; k++ { i, j := x+dirs[k], y+dirs[k+1] if i >= 0 && i < m-1 && j >= 0 && j < n-1 { cnt[int64(i*n+j)]++ } } } ans := make([]int64, 5) ans[0] = int64((m - 1) * (n - 1)) for _, x := range cnt { ans[x]++ ans[0]-- } return ans }
-
function countBlackBlocks(m: number, n: number, coordinates: number[][]): number[] { const cnt: Map<number, number> = new Map(); const dirs: number[] = [0, 0, -1, -1, 0]; for (const [x, y] of coordinates) { for (let k = 0; k < 4; ++k) { const [i, j] = [x + dirs[k], y + dirs[k + 1]]; if (i >= 0 && i < m - 1 && j >= 0 && j < n - 1) { const key = i * n + j; cnt.set(key, (cnt.get(key) || 0) + 1); } } } const ans: number[] = Array(5).fill(0); ans[0] = (m - 1) * (n - 1); for (const [_, x] of cnt) { ++ans[x]; --ans[0]; } return ans; }