LeetCode130被围绕的区域

昨天偶然看到了一篇文章

讲的是一位竞赛大佬参加各种学科竞赛的故事

深受刺激

我决定也要向这位大佬学习

就从Kaggle比赛开始吧

接下来一个学期我要沉迷于学科竞赛无法自拔了

哈哈哈哈哈哈哈哈


130-被围绕的区域

给定一个二维的矩阵,包含 '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'。
如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

思路:

这一题的主要思想就是深度遍历搜索法。其实题目就是要我们区分开两种情况:

  1. 如果给定区域的边缘行列中出现了“O”,并且有“O”与其相连,则连接的“O”区域不能被替换成“X”
  2. 如果在给定区域内部中出现了连续的“O”,并且其周围都被“X”包围,则该“O”区域可被替换成“X”

两种情况其实只要我们找出了一种情况,并且能把它成功替换,另外一种就好解决了。此题中是想先找出第一种情况,可从给定区域的四周依次往中间遍历,即第一行,第一列,最后一行以及最后一列。之所以要这么麻烦,是考虑到连续的“O”区域可能有好几块,相互不贯通,所以得从四个维度去遍历,避免漏选。如下图所示:

因为第一种情况下的“O”是不需要被替换成“X”的,所以为了标记它们,我们得把它们先替换成“*”,最后遍历区域的时候再把它们替换成“O”

代码如下:

class Solution(object):
    # 可使用深度优先搜索(DFS)求解
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        """
        # 判断给定区域是否为空
        if len(board) ==0 or len(board[0]) == 0:
            return
        # 获取行列值
        rows = len(board)
        cols = len(board[0])
        # 从第一列和最后一列依次往中间做深度遍历,看区域中是否有与边缘列相连的"0"
        # 如果存在这样的"0",将其变成"*",最后我们是要将其变成"0"的
        for row in range(rows):
            self.dfs(board, row, 0)
            self.dfs(board, row, cols-1)
        for col in range(cols):
            self.dfs(board, 0, col)
            self.dfs(board, rows-1, col)
        # 标记为"*"的就要重新变成"0"了,仍然为"0"的则要变成"X"了
        for row in range(rows):
            for col in range(cols):
                if board[row][col] == "*":
                    board[row][col] = "O"
                elif board[row][col] == "O":
                    board[row][col] = "X"

    # 深度遍历搜索
    def dfs(self, board, row, col):
        if row not in range(0,len(board)) or col not in range(0,len(board[0])) or board[row][col] != "O":
            return
        board[row][col] = "*"
        # 遍历上下左右四个方向
        self.dfs(board, row-1, col)
        self.dfs(board, row, col+1)
        self.dfs(board, row+1, col)
        self.dfs(board, row, col-1)

if __name__ == "__main__":
    board = [["X","X","X","X"], ["X","O","O","X"],
             ["X","X","O","X"], ["X","O","X","X"]]
    Solution().solve(board)

不过执行效率比较低,在10%左右,看了网上大佬的解法,好像都是这样,有些奇怪。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值