LeetCode 130. Surrounded Regions

简介: 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

v2-7d235f654704a77f2c0f9c667bdb3a29_1440w.jpg


Description



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.


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


Explanation:


Surrounded regions shouldn’t be on the border, which means that any 'O' on the border of the board are not flipped to 'X'. Any 'O' that is not on the border and it is not connected to an 'O' on the border will be flipped to 'X'. Two cells are connected if they are adjacent cells connected horizontally or vertically.


描述



给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。


示例:


X X X X
X O O X
X X O X
X O X X


运行你的函数后,矩阵变为:


X X X X
X X X X
X X X X
X O X X


解释:


被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。


思路



  • 此题目使用了深度优先搜索.
  • 我们检查矩阵的第一行,最后一行,第一列,最后一列有没有"O",如果有,我们从此位置进行深度优先遍历,将从此位置开始所有连续的"O"都置为一个标记元素,如"1".
  • 然后我们在进行遍历,将所有的"1"都置为"O",其他元素都置为"X".


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-05 22:10:17
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-06 14:25:42
from pprint import pprint
class Solution:
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: void Do not return anything, modify board in-place instead.
        """
        # 如果矩阵为空,则直接返回
        if not board:
            return
        # 获取矩阵行数和列数
        row, col = len(board), len(board[0])
        # 遍历第一行和最后一行
        for i in range(0, row):
            # 如果当前的元素为"O",则进行深度优先遍历,将所有的"O"都置为"1"
            # (或者其他标记元素,只要不是"X"或"O"即可)
            # 检查第一行的所有元素
            if board[i][0] == "O":
                self.dfs(board, i, 0, row, col)
            # 检查最后一行的所有元素
            if board[i][col-1] == 'O':
                self.dfs(board, i, col-1, row, col)
        # 同上,遍历第一列和最后一列的所有元素
        for i in range(1, col-1):
            if board[0][i] == 'O':
                self.dfs(board, 0, i, row, col)
            if board[row-1][i] == 'O':
                self.dfs(board, row-1, i, row, col)
        # 遍历所有元素,将刚才标记的元素置为"O",其他元素都置为"X"
        for i in range(0, row):
            for j in range(0, col):
                if board[i][j] == "1":
                    board[i][j] = "O"
                else:
                    board[i][j] = "X"
    def dfs(self, board, row, col, rows, cols):
        # 递归结束条件,如果已经越界则结束递归
        if row >= rows or col >= cols or row < 0 or col < 0:
            return
        # 如果当前元素是"O",则置为标记元素"1"
        if board[row][col] == "O":
            board[row][col] = '1'
            # 进行深度优先遍历,一共有上下左右四个出口
            self.dfs(board, row+1, col, rows, cols)
            self.dfs(board, row-1, col, rows, cols)
            self.dfs(board, row, col+1, rows, cols)
            self.dfs(board, row, col-1, rows, cols)


源代码文件在这里.

目录
相关文章
[LeetCode] Surrounded Regions
This problem is not quite difficult (a typical BFS traversal of graph), though, its aceptance rate is relatively low.
770 0
|
28天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
50 6
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
43 4
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
99 2
|
28天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
47 7