2768-黑格子的数目
给你两个整数 m 和 n ,表示一个下标从 0 开始的 m x n 的网格图。
给你一个下标从 0 开始的二维整数矩阵 coordinates ,其中 coordinates[i] = [x, y] 表示坐标为[x, y] 的格子是 黑色的 ,所有没出现在 coordinates 中的格子都是 白色的 。
一个块定义为网格图中 2 x 2 的一个子矩阵。更正式的,对于左上角格子为 [x, y] 的块,其中 0 <= x < m - 1 且 0 <= y < n - 1 ,包含坐标为 [x, y] ,[x + 1, y] ,[x, y + 1] 和 [x + 1, y + 1]
的格子。
请你返回一个下标从 0 开始长度为 5 的整数数组 arr ,arr[i] 表示恰好包含 i 个 黑色
格子的块的数目。
示例 1:
**输入:** m = 3, n = 3, coordinates = [[0,0]]
**输出:** [3,1,0,0,0]
**解释:** 网格图如下:

只有 1 个块有一个黑色格子,这个块是左上角为 [0,0] 的块。
其他 3 个左上角分别为 [0,1] ,[1,0] 和 [1,1] 的块都有 0 个黑格子。
所以我们返回 [3,1,0,0,0] 。
示例 2:
**输入:** m = 3, n = 3, coordinates = [[0,0],[1,1],[0,2]]
**输出:** [0,2,2,0,0]
**解释:** 网格图如下:

有 2 个块有 2 个黑色格子(左上角格子分别为 [0,0] 和 [0,1])。
左上角为 [1,0] 和 [1,1] 的两个块,都有 1 个黑格子。
所以我们返回 [0,2,2,0,0] 。
提示:
2 <= m <= 1052 <= n <= 1050 <= coordinates.length <= 104coordinates[i].length == 20 <= coordinates[i][0] < m0 <= coordinates[i][1] < ncoordinates中的坐标对两两互不相同。
下午两点【b站@灵茶山艾府】 直播讲题,欢迎关注!
在 m 和 n 都很大的情况下,网格中有大量的 2\times 2 的子矩阵是没有黑色格子的。只需要考虑有黑色格子的子矩阵。
如果 (x,y) 处有黑色格子,那么子矩阵左上角在 (x-1,y-1),(x-1,y),(x,y-1),(x,y) 都是包含这个黑色格子的,统计这些子矩阵中有多少黑色格子,加到答案中。
代码实现时,注意不要重复统计,可以用哈希表 vis 来记录统计过的子矩阵左上角。
最后不含黑色格子的子矩阵个数就是
(m-1)\cdot (n-1) - \text{len}(\textit{vis})
1 | class Solution: |
1 | func countBlackBlocks(m, n int, coordinates [][]int) []int64 { |
复杂度分析
- 时间复杂度:\mathcal{O}(k),其中 k 为 coordinates 的长度。
- 空间复杂度:\mathcal{O}(k)。
Comments