题目
给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。
岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。
你可以将任意数量的 0 变为 1 ,以使两座岛连接起来,变成 一座岛 。
返回必须翻转的 0 的最小数目。
示例
示例 1:
输入:grid = [[0,1],[1,0]]
输出:1
示例 2:
输入:grid = [[0,1,0],[0,0,0],[0,0,1]]
输出:2
示例 3:
输入:grid =
[[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]]
输出:1
思路
思路简单这里采用深度优先搜索+广度优先搜索,但是做起来比较麻烦。
我们可以利用深度优先搜索求出其中的一座岛,然后利用广度优先搜索来找到两座岛的最短距离。深度度优先搜索时,我们可以将已经遍历过的位置标记为 −1,实际计算过程如下:
- 我们通过遍历找到数组 grid中的 1 后进行深度优先搜索,此时可以得到第一座岛的位置集合,记为 island,并将其位置全部标记为 −1。
- 随后我们从 island 中的所有位置开始进行广度优先搜索,当它们到达了任意的 1时,即表示搜索到了第二个岛,搜索的层数就是答案。
题解
class Solution: def shortestBridge(self, grid: List[List[int]]) -> int: n = len(grid) for i, row in enumerate(grid): for j, v in enumerate(row): if v != 1: continue q = [] def dfs(x: int, y: int) -> None: 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 < n and 0 <= ny < n and grid[nx][ny] == 1: dfs(nx, ny) dfs(i, j) step = 0 while True: tmp = q q = [] for x, y in tmp: for nx, ny in (x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1): if 0 <= nx < n and 0 <= ny < n: if grid[nx][ny] == 1: return step if grid[nx][ny] == 0: grid[nx][ny] = -1 q.append((nx, ny)) step += 1