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
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Surrounded Regions
- Mongodb 3.x 多副本集群配置
- BSGS模板(模数为质数)
- Android性能优化之利用LeakCanary检测内存泄漏及解决办法(转)
- Nanopi2 挂载U盘
- SpringBoot学习笔记(三):问题--th:replace老是提示解析模板出错
- Surrounded Regions
- Dev C++ 源文件编译时,确实没问题,但是运行时,总是提示源文件 未编译
- leetcode118~Pascal's Triangle
- 讀取影片(VideoCapture)
- Android Studio 修改包名最便捷做法
- PAT 1114
- H3 BPM总部乔迁 开启新篇章 筑梦新征程
- Git主要命令操作详解
- 权限修饰符