返回

leetcode刷题日记-【130. 被围绕的区域】- 聪明的计算就能轻松解决的问题,还等什么?

后端

众所周知,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刷题日记系列文章,我们下期再见!