原题
https://leetcode.cn/problems/surrounded-regions/description/
思路
深度优先搜索
复杂度
时间:O(mn)
空间:O(mn)
Python代码
class Solution:
def solve(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
m, n = len(board), len(board[0])
def dfs(i, j):
if 0 <= i <= m-1 and 0 <= j <= n-1 and board[i][j] == 'O':
# 标记替换为 'M'
board[i][j] = 'M'
# 搜索四周
dfs(i, j-1)
dfs(i, j+1)
dfs(i-1, j)
dfs(i+1, j)
else:
return
# 对四周的'O'进行深度搜索
for j in range(n):
if board[0][j] == 'O':
dfs(0, j)
if board[m-1][j] == 'O':
dfs(m-1, j)
for i in range(m):
if board[i][0] == 'O':
dfs(i, 0)
if board[i][n-1] == 'O':
dfs(i, n-1)
for i in range(m):
for j in range(n):
# 还原
if board[i][j] == 'M':
board[i][j] = 'O'
elif board[i][j] == 'O':
board[i][j] = 'X'
Go代码
func solve(board [][]byte) {
m, n := len(board), len(board[0])
var dfs func(int, int)
dfs = func(i int, j int) {
if 0 <= i && i <= m-1 && 0 <= j && j <= n-1 && board[i][j] == 'O' {
// 标记替换为 'M'
board[i][j] = 'M'
// 搜索四周
dfs(i, j-1)
dfs(i, j+1)
dfs(i-1, j)
dfs(i+1, j)
}
}
// 对边缘的'O'进行深度搜索并标记为'M'
for j := 0; j < n; j++ {
if board[0][j] == 'O' {
dfs(0, j)
}
if board[m-1][j] == 'O' {
dfs(m-1, j)
}
}
for i := 0; i < m; i++ {
if board[i][0] == 'O' {
dfs(i, 0)
}
if board[i][n-1] == 'O' {
dfs(i, n-1)
}
}
// 将'O' 替换为 'X'
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
// 将'M'还原为'O'
if board[i][j] == 'M' {
board[i][j] = 'O'
} else if board[i][j] == 'O' {
board[i][j] = 'X'
}
}
}
}
341

被折叠的 条评论
为什么被折叠?



