题目:给定一个二维的矩阵,包含 'X'
和 'O'
(字母 O),找到所有被 'X'
围绕的区域,并将这些区域里所有的 'O'
用 'X'
填充。
思路:任何边界上的 'O'
都不会被填充为 'X'
。 任何不在边界上,或不与边界上的 'O'
相连的 'O'
最终都会被填充为 'X'
。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。
我们对边界的O进行dfs,先把边界O的’O’变为“ * ” ,然后对边界上的" O "进行DFS,和它连通的‘ O’,都标记为‘ * ’,最后在遍历数组,把‘ O’变成‘X’,把‘ * ’,变成‘’O‘’。
代码:
class Solution(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: None Do not return anything, modify board in-place instead.
"""
#边界的O替换
if board==None:
return []
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j]=='O':
if i==0 or i==len(board)-1 or j==0 or j==len(board[0])-1:
self.dfs(board,i,j,len(board),len(board[0]))
#最后在遍历数组,把‘ O’变成‘X’,把‘ * ’,变成‘’O‘’
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j]=='O':
board[i][j]='X'
else:
if board[i][j]=='*':
board[i][j]='O'
#找与边界O相连通的
def dfs(self,board,x,y,m,n):
d=[(-1,0),(0,1),(1,0),(0,-1)]
board[x][y]='*'
for i in range(4):
newx=x+d[i][0]
newy=y+d[i][1]
if newx>=0 and newx=0 and newy
结果:
与此类题目相同的在Leetcode上有题79,200,417,都属于二维平面回溯法,当然题200,130,417考察floodfill算法,深度优先遍历。
补充:417题
题目:
大意:上面一条边和左边一条边代表的是太平洋,用‘~’表示。右边一条边和下边一条边代表的是大西洋,用‘*’表示。问哪些位置的水能同时流进太平洋和大西洋?我们使用两个二维数组,分别记录每个位置的点能不能到达太平洋和大西洋,可以标记True。然后对4条边界进行遍历,看以这些边为起点遍历的地方。因为是从边界向中间去寻找,所以,这个时候是新的点要比当前的点海拔高才行。
代码:
class Solution(object):
def pacificAtlantic(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
"""
if not matrix or not matrix[0]: return []
m, n = len(matrix), len(matrix[0])
p_visited = [[False] * n for _ in range(m)]
a_visited = [[False] * n for _ in range(m)]
for i in range(m):#左右两条边
self.dfs(p_visited, matrix, m, n, i, 0)
self.dfs(a_visited, matrix, m, n, i, n -1)
for j in range(n):#上下两条边
self.dfs(p_visited, matrix, m, n, 0, j)
self.dfs(a_visited, matrix, m, n, m - 1, j)
#同时流入两个大洋的点
res = []
for i in range(m):
for j in range(n):
if p_visited[i][j] and a_visited[i][j]:
res.append([i, j])
return res
def dfs(self, visited, matrix, m, n, i, j):
visited[i][j] = True
d= [(-1, 0), (1, 0), (0, 1), (0, -1)]
for k in range(4):
x=i+d[k][0]
y=j+d[k][1]
if x < 0 or x >= m or y < 0 or y >= n or visited[x][y] or matrix[x][y] < matrix[i][j]:
continue
self.dfs(visited, matrix, m, n, x, y)
结果:
2020.7.15——找工作的气氛非常紧张,小王一定不要放弃,祝未来可期