返回
leetcode刷题日记-【130. 被围绕的区域】- 聪明的计算就能轻松解决的问题,还等什么?
后端
2023-11-12 08:42:01
众所周知,leetcode刷题日记作为我的一个系列文章,不仅仅是一篇简单的题解,更是与读者的一种交流。
在这一系列中,我既会对LeetCode题目进行剖析,也会分享自己的解题思路,当然,最重要的是能够帮助读者理解算法,并将其应用到自己的编程实践中。
今天,我们就来聊聊LeetCode 130. 被围绕的区域这道题。
这道题的题意很简单:给定一个二维数组board,数组中元素只包含'O'和'X',将二位数组中所有不和边界的'O'元素替换为'X'。
首先,我们先来分析一下这道题的解题思路。
由于只有不和边界的'O'元素会被替换为'X',因此,我们可以从边界开始,对所有'O'元素进行标记。
我们可以用一个visited数组来记录哪些'O'元素已经被标记,然后,从边界开始,对每个'O'元素进行DFS或者BFS,并将所有与之相邻的'O'元素也标记为visited。
这样一来,所有不和边界的'O'元素都会被标记,而这些元素就是我们要替换的元素。
标记完成后,我们只需要将所有visited为true的'O'元素替换为'X'即可。
根据上面的解题思路,我们可以给出python代码如下:
def solve(board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
if not board or not board[0]:
return
m, n = len(board), len(board[0])
visited = [[False] * n for _ in range(m)]
def dfs(i, j):
if i < 0 or i >= m or j < 0 or j >= n or board[i][j] != 'O' or visited[i][j]:
return
visited[i][j] = True
dfs(i + 1, j)
dfs(i - 1, j)
dfs(i, j + 1)
dfs(i, j - 1)
# 从边界开始,对所有'O'元素进行标记
for i in range(m):
dfs(i, 0)
dfs(i, n - 1)
for j in range(n):
dfs(0, j)
dfs(m - 1, j)
# 将所有visited为true的'O'元素替换为'X'
for i in range(m):
for j in range(n):
if board[i][j] == 'O' and not visited[i][j]:
board[i][j] = 'X'
LeetCode 130. 被围绕的区域。这道题考察了算法中的dfs(深度优先搜索)算法和bfs(广度优先搜索)算法,利用这些基础算法构建解题思路,再加以coding,便能将此题轻松拿下。
好了,这就是LeetCode 130. 被围绕的区域这道题的解法,希望对大家有所帮助。
如果大家还有其他问题,欢迎在评论区留言,我会一一解答。
最后,也希望大家能够继续关注我的leetcode刷题日记系列文章,我们下期再见!