深度优先搜索、130

1、深度优先搜索

# 深度优先
def dfs(node=None):
    if node is None:
        return
    
    nodeSet=set()  # 定义登记节点集合
    stack=[]   # 用List来表示栈
    
    print(node.getValue())  # 打印节点的值
    nodeSet.add(node)  # 登记遍历过的节点
    stack.append(node) # 将节点压入栈
    
    while len(stack)>0:
        
        cur=stack.pop()  # 将list中最末尾的元素删除,并返回元素值
        
        for next in cur.getConnect():   # 遍历该节点的邻接节点
            
            if next not in nodeSet:     # 如果该节点还没登记
                print(next.getValue())  # 打印邻接节点的值
                
                nodeSet.add(next)       # 登记邻接节点
                stack.append(cur)      # 将节点再次压入
                stack.append(next)     # 将邻接节点压入  
                break  # 退出,保持深度优先


130、被围绕的区域

在这里插入图片描述
我完全没看懂题目,引用https://blog.csdn.net/qq_17550379/article/details/82688731

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

这个问题,和之前的 Leetcode 79:单词搜索(最详细的解法!!!)、Leetcode 200:岛屿的个数(最详细的解法!!!)很类似。这个问题一个很简单的处理思路就是将外围的O元素单独考虑。基于这个思路,我们将外围的O替换为标记为*。

X X X X
X O O X
X X O X
X * X X

然后我们就只要将图中的O替换成X,将*替换成O即可。这里有这样一种情况

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

这里的O全部就外围元素。替换为*,就变成了

X X X X
X * * X
X X * X
X * * X

所以我们现在的问题就变成了:在这个图的边界位置出发找连通的O。这就和之前的问题联系在一起了。

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 None

        m, n = len(board), len(board[0])
        d = [(-1, 0), (0, 1), (1, 0), (0, -1)]
        
        def _solve(i, j):
            if 0 <= i < m and 0 <= j < n and board[i][j] == 'O':
                board[i][j] = '*'
                for k in range(4):
                    _solve(i + d[k][0], j + d[k][1])

        for i in range(m):
            _solve(i, 0)
            _solve(i, n - 1)

        for i in range(n):
            _solve(0, i)
            _solve(m - 1, i)

        for i in range(m):
            for j in range(n):
                if board[i][j] == 'O':
                    board[i][j] = 'X'
                elif board[i][j] == '*':
                    board[i][j] = 'O'

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值