美文网首页北美程序员面试干货
LeetCode 130 [Surrounded Regions

LeetCode 130 [Surrounded Regions

作者: Jason_Yuan | 来源:发表于2016-07-21 15:32 被阅读276次

原题

给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满。

样例
给出二维矩阵:

X X X X
X O O X
X X O X
X O X X

把被 'X' 围绕的区域填充之后变为:

X X X X
X X X X
X X X X
X O X X

解题思路

  • 通过分析可知,就是要将所有以O组成、但没有连通到网格边缘的区域变为X。
  • 所以可以沿着四个边找O,找到每一个O就把相连的都变成Y,因为 他们都是要保留的,最后遍历二维数组,遇到O变成X,遇到Y变回O
  • 具体方法可以采用BFS, DFS, Union Find,但是DFS大数据会爆栈,DFS最快

完整代码

import Queue
class Solution(object):
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        def fill(x, y):
            if x < 0 or x > height-1 or y < 0 or y > width-1 or board[x][y] != "O":
                return
            MyQueue.put((x, y))
            board[x][y] = "D"
            
        def bfs(x, y):
            if board[x][y] == "O":
                fill(x, y)
                
            while not MyQueue.empty():
                current = MyQueue.get()
                i, j = current[0], current[1]
                fill(i+1, j)
                fill(i-1, j)
                fill(i, j+1)
                fill(i, j-1)
                
        if len(board) == 0:
            return
        
        height, width, MyQueue = len(board), len(board[0]), Queue.Queue()
        for i in range(width):
            bfs(0, i)
            bfs(height - 1, i)
        
        for j in range(1, height - 1):
            bfs(j, 0)
            bfs(j, width - 1)
            
        for i in range(height):
            for j in range(width):
                if board[i][j] == "D":
                    board[i][j] = "O"
                elif board[i][j] == "O":
                    board[i][j] = "X"

相关文章

网友评论

    本文标题:LeetCode 130 [Surrounded Regions

    本文链接:https://www.haomeiwen.com/subject/smubjttx.html