934. 最短的桥

发布时间 2023-04-13 17:38:31作者: zhangk1988

题目描述

矩阵中有两个岛屿
问岛之间的最小距离?

f1- bsf + bfs

基本分析

  1. 怎么求第一个岛的所有点?找到第一个1后bfs
  2. 怎么保证不重复添加?入队的点设置为-1
  3. 怎么求到第二个岛的最小距离?第一个岛的所有点入队,遍历一轮step+1,遇到1的时候返回step

代码

class Solution:
    def shortestBridge(self, grid):
        m, n = len(grid), len(grid[0])

        flag = True
        for i, row in enumerate(grid):
            for j, v in enumerate(row):
                if v != 1:
                    continue
                q = deque([(i, j)])
                grid[i][j] = -1
                island1 = []
                while q:
                    x, y = q.popleft()
                    island1.append((x, y))
                    for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                        if 0 <= nx < m and 0 <= ny <n and grid[nx][ny] == 1:
                            q.append((nx, ny))
                            grid[nx][ny] = -1
   

                step = 0
                q = deque(island1)
                while q:
                    for _ in range(len(q)):
                        x, y = q.popleft()
                        for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                            if 0 <= nx < m and 0 <= ny < n:
                                if grid[nx][ny] == 1:
                                    return step
                                if grid[nx][ny] == 0:
                                    q.append((nx, ny))
                                    grid[nx][ny] = -1
                    step += 1

总结

  1. 为啥在循环内bfs?找到第一个点集就开始bfs,不是在循环外bfs。如果这样,点集会是第二个岛,其余点都是-1了,没打进行第二轮bfs
  2. step怎么算?初始值设置为0,传播一圈后+1

f2 dfs + bfs

基本分析

  1. 找第一个点集还有啥其他方法?dfs

代码

class Solution:
    def shortestBridge(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        
        def dfs(x, y):
            grid[x][y] = -1
            q.append((x, y))
            for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == 1:
                    dfs(nx, ny)

        for i, row in enumerate(grid):
            for j, v in enumerate(row):
                if v != 1:
                    continue
                q = []

                dfs(i, j)

                step = 0
                q = deque(q)
                while q:
                    for _ in range(len(q)):
                        x, y = q.popleft()
                        for nx, ny in ((x+1, y), (x-1, y), (x, y+1), (x, y-1)):
                            if 0 <= nx < m and 0 <= ny < n: 
                                if grid[nx][ny] == 0:
                                    q.append((nx, ny))
                                    grid[nx][ny] = -1
                                if grid[nx][ny] == 1:
                                    return step
                    step += 1

总结

  1. 掌握dfs存第一个点集的思路

f3-并查集+ 双向bfs
待完善

基本分析

  1. xxx

代码


总结

  1. xxx