题目描述
给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O)。
找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
示例:
1 | X X X X |
运行你的函数后,矩阵变为:
1 | X X X X |
解释:
被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
分析
本题可以用DFS(深度优先搜索)解决。
找到所有被X
围绕的区域不容易,但是其等价于找到所有没有没有被X
围绕的区域(连接边界的区域),这样就可以从边界上的O
开始进行深度优先搜索,
举个例子:
1 | X X X X |
对于上面这张图的边界,只有第四行第二列的内容是O
,我们对其进行DFS,即DFS(3,1)
首先将它本身改为#
1 | X X X X |
之后对该位置的上下左右进行搜索,即分别尝试DFS(2,1)
,DFS(4,1)
,DFS(3,0)
,DFS(3,2)
,如果越界或者内容不是O
则停止搜索。
因为此位置左右是X,下面超出数组下边界,只有上面是O
,所以继续进行DFS(2,1)
。
1 | X X X X |
和之前一样,先将其本身改为#,之后上下左右进行DFS,而对于此坐标上下左右都不是O
,所以搜索结束。
最后遍历全图,将所有的#改为O
,所有的O
改为X
即可。
最终结果:
1 | X X X X |
代码
1 | class Solution: |
执行用时 :140 ms, 在所有Python3提交中击败了98.19%的用户
内存消耗 :14.6 MB, 在所有Python3提交中击败了74.24%的用户