Surrounded Regions

来源:互联网 发布:hadoop 1T数据 编辑:程序博客网 时间:2024/06/01 07:18

Given a 2D board containing ‘X’ and ‘O’ (the letter O), capture all regions surrounded by ‘X’.

A region is captured by flipping all ‘O’s into ‘X’s in that surrounded region.

For example,
X X X X
X O O X
X X O X
X O X X

After running your function, the board should be:
X X X X
X X X X
X X X X
X O X X

用了DFS,发现会内存溢出。思路如下,对于边际上的每一个’O’,找到他们的连通分量,设置为’S’。之后将’O’设置为’X’,将’S’设置为’O’。代码如下:

class Solution(object):    def dfs(self, i, j, board):        if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]):            return        if board[i][j] == 'O':            board[i][j] = 'q'            self.dfs(i, j+1, board)            self.dfs(i, j-1, board)            self.dfs(i-1, j, board)            self.dfs(i+1, j, board)    def solve(self, board):        """        :type board: List[List[str]]        :rtype: void Do not return anything, modify board in-place instead.        """        if len(board) != 0:            for i in range(len(board)):                if i == 0 or i == len(board) - 1:                    for j in range(len(board[0])):                        if board[i][j] == 'O':                            self.dfs(i, j, board)                else:                    for j in [0, len(board[0]) - 1]:                        if board[i][j] == 'O':                            self.dfs(i, j, board)            for i in range(len(board)):                for j in range(len(board[0])):                    if board[i][j] == 'O':                        board[i][j] = 'X'            for i in range(len(board)):                for j in range(len(board[0])):                    if board[i][j] == 'q':                        board[i][j] = 'O'

这样想来,这一类题目还是用Union-find让人觉得更安心一点。

class UF(object):    def union(self, a, b, tmp_board, size):        p = self.root(a, tmp_board)        q = self.root(b, tmp_board)        if p == q:            return        if size[p] > size[q]:            tmp_board[q] = p            size[p] += size[q]        else:            tmp_board[p] = q            size[q] += size[p]    def root(self, a, tmp_board):        while(tmp_board[a] != a):            tmp_board[a] = tmp_board[tmp_board[a]]            a = tmp_board[a]        return a    def connected(self, a, b, tmp_board):        return self.root(a, tmp_board) == self.root(b, tmp_board)class Solution(object):    def solve(self, board):        """        :type board: List[List[str]]        :rtype: void Do not return anything, modify board in-place instead.        """        m = len(board)        uf = UF()        if m == 0:            return        n = len(board[0])        tmp_board = [i for i in range(m*n+1)]        size = [1] * (m*n+1)        for i in range(m):            for j in range(n):                if board[i][j] == 'O':                    if j+1 < n:                        if board[i][j+1] == 'O':                            uf.union(i*n+j, i*n+j+1, tmp_board, size)                    if i+1 < m:                        if board[i+1][j] == 'O':                            uf.union((i+1)*n+j, i*n+j, tmp_board, size)        for i in range(m):            if i == 0 or i == m-1:                for j in range(n):                    uf.union(m*n, i*n+j, tmp_board, size)            else:                for j in [0, n-1]:                    uf.union(m*n, i*n+j, tmp_board, size)        for i in range(m):            for j in range(n):                if not uf.connected(i*n+j, m*n, tmp_board):                    board[i][j] = 'X'
0 0
原创粉丝点击