Leetcode 803
Description
有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白。砖块 稳定(不会掉落)的前提是:
- 一块砖直接连接到网格的顶部,或者
- 至少有一块相邻(4 个方向之一)砖块 稳定 不会掉落时
给你一个数组 hits ,这是需要依次消除砖块的位置。每当消除 hits[i] = (rowi, coli) 位置上的砖块时,对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这一消除操作而掉落。一旦砖块掉落,它会立即从网格中消失(即,它不会落在其他稳定的砖块上)。
返回一个数组 result ,其中 result[i] 表示第 i 次消除操作对应掉落的砖块数目。
注意,消除可能指向是没有砖块的空白位置,如果发生这种情况,则没有砖块掉落。
Sample
示例 1:
1 | 输入:grid = [[1,0,0,0],[1,1,1,0]], hits = [[1,0]] |
示例 2:
1 | 输入:grid = [[1,0,0,0],[1,1,0,0]], hits = [[1,1],[1,0]] |
Hint
m == grid.lengthn == grid[i].length1 <= m, n <= 200grid[i][j]为0或11 <= hits.length <= 4 * 10^4hits[i].length == 20 <= xi <= m - 10 <= yi <= n - 1- 所有
(xi, yi)互不相同
Solution
很巧妙的题目,正常来说,需要维护一个数据结构,来不断的判断 “删除”结点之后图的连通性。
可复杂就复杂在,这是一张图,不是一颗树,删除某个结点后,可能仍然保持连通。
本题的精彩之处就在于 逆序 处理:倒过来添加结点。添加结点后连通块增大的部分,就是删除该结点后掉落的部分。
显然 “添加” 要远比 “删除” 简单的多,本题仅需要考虑连通性和连通块的大小,并查集就可以满足需求。
Code
1 | class Solution: |