来自北大算法课的Leetcode题解:934. 最短的桥

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

这题真的很好!

  • 解法1(T75% S14%):本质上是求一个连通图到另一个连通图的最短距离,是一道DFS+BFS的题。为什么需要DFS呢?因为这里面有两个图,需要一次DFS完全找到一个图,将二者区分。为什么需要BFS呢?按宽度遍历可以找到最近的桥。因此首先遍历二维数组找到第一个1,也就是找到第一个图的一个点,然后一遍DFS把整个图1都标上数字2以区分,并将所有图1的节点加入一个队列。然后依次出队进行BFS扩展,直到某次扩展找到了另一张图中某个点,最短桥也就找到了。
class Solution(object):
    def shortestBridge(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        N = len(grid)

        def DFS(x, y):
            if x<0 or y<0 or x>N-1 or y>N-1: return
            if grid[x][y] != 1: return
            if grid[x][y] == 1:
                grid[x][y] = 2
                S.add((x, y))
            DFS(x+1, y)
            DFS(x-1, y)
            DFS(x, y+1)
            DFS(x, y-1)

        def BFS():
            queue = []
            visited = set()
            for s in S:
                queue.append((s,0))
                visited.add(s)
            while queue:
                (i, j), step = queue.pop(0)
                if grid[i][j] == 1: return step-1
                for x, y in [(i-1,j),(i,j-1),(i+1,j),(i,j+1)]:
                    if x>=0 and y>=0 and x<=N-1 and y<=N-1:
                        if (x,y) not in visited:
                            visited.add((x,y))
                            queue.append(((x,y),step+1))
        
        S = set()
        flag = False
        for i in range(N):
            for j in range(N):
                if grid[i][j] == 1:
                    DFS(i, j)
                    flag = True
                    break
            if flag: break
        
        return BFS()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

doubleZ0108

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

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

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

打赏作者

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

抵扣说明:

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

余额充值