python-LeetCode 130. 被围绕的区域

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

思路:任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

我们对边界的O进行dfs,先把边界O的’O’变为“ * ” ,然后对边界上的" O "进行DFS,和它连通的‘ O’,都标记为‘ * ’,最后在遍历数组,把‘ O’变成‘X’,把‘ * ’,变成‘’O‘’。

代码:

class Solution(object):
    def solve(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        """
        #边界的O替换
        if board==None:
            return []
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j]=='O':
                    if i==0 or i==len(board)-1 or j==0 or j==len(board[0])-1:
                        self.dfs(board,i,j,len(board),len(board[0]))
        #最后在遍历数组,把‘ O’变成‘X’,把‘ * ’,变成‘’O‘’
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j]=='O':
                    board[i][j]='X'
                else:
                    if board[i][j]=='*':
                        board[i][j]='O'
    #找与边界O相连通的                    
    def dfs(self,board,x,y,m,n):
        d=[(-1,0),(0,1),(1,0),(0,-1)]
        board[x][y]='*'
        for i in range(4):
            newx=x+d[i][0]
            newy=y+d[i][1]
            if newx>=0 and newx<m and newy>=0 and newy<n and board[newx][newy]=='O':
                self.dfs(board,newx,newy,m,n)

结果:

与此类题目相同的在Leetcode上有题79,200,417,都属于二维平面回溯法,当然题200,130,417考察floodfill算法,深度优先遍历。

补充:417题

题目:

大意:上面一条边和左边一条边代表的是太平洋,用‘~’表示。右边一条边和下边一条边代表的是大西洋,用‘*’表示。问哪些位置的水能同时流进太平洋和大西洋?我们使用两个二维数组,分别记录每个位置的点能不能到达太平洋和大西洋,可以标记True。然后对4条边界进行遍历,看以这些边为起点遍历的地方。因为是从边界向中间去寻找,所以,这个时候是新的点要比当前的点海拔高才行。

代码:

class Solution(object):
    def pacificAtlantic(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[List[int]]
        """
        if not matrix or not matrix[0]: return []
        m, n = len(matrix), len(matrix[0])
        p_visited = [[False] * n for _ in range(m)]
        a_visited = [[False] * n for _ in range(m)]
        for i in range(m):#左右两条边
            self.dfs(p_visited, matrix, m, n, i, 0)
            self.dfs(a_visited, matrix, m, n, i, n -1)
        for j in range(n):#上下两条边
            self.dfs(p_visited, matrix, m, n, 0, j)
            self.dfs(a_visited, matrix, m, n, m - 1, j)
        #同时流入两个大洋的点
        res = []
        for i in range(m):
            for j in range(n):
                if p_visited[i][j] and a_visited[i][j]:
                    res.append([i, j])
        return res
        
    def dfs(self, visited, matrix, m, n, i, j):
        visited[i][j] = True
        d= [(-1, 0), (1, 0), (0, 1), (0, -1)]
        for k in range(4):
            x=i+d[k][0]
            y=j+d[k][1]
            if x < 0 or x >= m or y < 0 or y >= n or visited[x][y] or matrix[x][y] < matrix[i][j]:
                continue
            self.dfs(visited, matrix, m, n, x, y)

结果:

 

2020.7.15——找工作的气氛非常紧张,小王一定不要放弃,祝未来可期

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值