• 130. 被围绕的区域


    题目-中等难度

    给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

    示例

    示例 1:
    在这里插入图片描述

    输入:board = [[“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’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

    示例 2:

    输入:board = [[“X”]]
    输出:[[“X”]]

    提示:

    • m == board.length
    • n == board[i].length
    • 1 <= m, n <= 200
    • board[i][j] 为 ‘X’ 或 ‘O’

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/summary-ranges
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. 新建board+bfs

    时间
    56ms
    击败 56.75%使用 Python3 的用户
    内存
    19.75MB
    击败 91.89%使用 Python3 的用户

    class Solution:
        def solve(self, board: List[List[str]]) -> None:
            """
            Do not return anything, modify board in-place instead.
            """
            # 板长宽
            lb, lbb = len(board), len(board[0])
            # 新建板, 默认为X
            newB = [['X'] * lbb for _ in range(lb)]
            # 新列表存储边界上为O的坐标
            oli = []
            # 将边界上为O的左边添加到oli
            for i in range(lb):
                for j in range(lbb):
                    if board[i][j] == 'O' and (i == 0 or j == 0 or i == lb-1 or j == lbb-1):
                        oli.append((i,j))
            # 遍历oli中的坐标
            for i,j in oli:
                # 添加至li列表开始广度优先搜索
                li = [(i,j)]
                while li:
                    # 获取当前网格
                    x,y = li.pop(0)
                    # 已经转换的跳过
                    if newB[x][y] == 'O':
                        continue
                    # 当前board网格值赋予给newB
                    newB[x][y] = 'O'
                    # 对网格进行搜索
                    for xx,yy in [(x+1,y),(x,y+1),(x-1,y),(x,y-1)]:
                        if 0<=xx<lb and 0<=yy<lbb and board[xx][yy] == 'O':
                            li.append((xx,yy))
            # 由于该算法不能直接返回newB, 所以需要给board再次赋值
            for i in range(lb):
                for j in range(lbb):
                    board[i][j] = newB[i][j]
            return board
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2. 哈希+bfs

    时间
    60ms
    击败 42.11%使用 Python3 的用户
    内存
    19.78MB
    击败 91.11%使用 Python3 的用户

    class Solution:
        def solve(self, board: List[List[str]]) -> None:
            """
            Do not return anything, modify board in-place instead.
            """
            # 板长宽
            lb, lbb = len(board), len(board[0])
            # 新列表存储边界上为O的坐标
            oli = []
            # 将边界上为O的左边添加到oli
            for i in range(lb):
                for j in range(lbb):
                    if board[i][j] == 'O' and (i == 0 or j == 0 or i == lb-1 or j == lbb-1):
                        oli.append((i,j))
            # 存储不会改变的O坐标
            visited = set()
            # 遍历oli中的坐标
            for i,j in oli:
                # 添加至li列表开始广度优先搜索
                li = [(i,j)]
                while li:
                    # 获取当前网格
                    x,y = li.pop(0)
                    # 如果当前坐标存在于visited内, 跳过
                    if (x,y) in visited:
                        continue
                    # 不存在则添加
                    else:
                        visited.add((x,y))
                    # 对网格进行搜索
                    for xx,yy in [(x+1,y),(x,y+1),(x-1,y),(x,y-1)]:
                        if 0<=xx<lb and 0<=yy<lbb and board[xx][yy] == 'O':
                            li.append((xx,yy))
            # 将不存在与visited内的所有O都变为X
            for i in range(lb):
                for j in range(lbb):
                    if board[i][j] == 'O' and (i,j) not in visited:
                        board[i][j] = 'X'
            return board
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
  • 相关阅读:
    今天的码农女孩继续总结jQuery的知识
    ElasticSearch之搜索词提示Sug
    Leetcode112. 路径总和
    [Power BI] 认识Power Query和M语言
    五、02【Java IO模型】之File类
    etcd实现大规模服务治理应用实战
    ONLYOFFICE8.1版本桌面编辑器测评
    压力之下番茄也会「惊声尖叫」,特拉维夫大学发现植物王国不沉默
    js层次选择器有哪些
    RuntimeError: Error compiling objects for extension手把手带你解决(超详细)
  • 原文地址:https://blog.csdn.net/Ashiu/article/details/133007450