题解的核心思路是使用广度优先搜索(BFS)来找到连接两座岛屿的最短桥。首先,通过遍历矩阵来找到第一个岛屿,并使用一个队列标记所有属于这个岛屿的坐标,同时将这些位置在grid中标记为-1以表示已访问。接着,使用多源BFS从第一个岛屿的所有位置开始扩展,搜索最短的路径到第二个岛屿。每扩展一层,步数增加1,如果遇到未访问的陆地(值为1),则返回当前步数,这表示找到了第二个岛屿,且当前步数即为需要翻转的最小0的数量。
时间复杂度: O(n*m)
空间复杂度: O(n*m)
class Solution:
def shortestBridge(self, grid: List[List[int]]) -> int:
dir = ((0, 1), (1, 0), (0, -1), (-1, 0))
n, m = len(grid), len(grid[0])
# 先随便找一个岛
st = list()
for i, row in enumerate(grid):
for j, c in enumerate(row):
if c == 1:
st.append((i, j))
grid[i][j] = -1
break
if st: break
# 扩展全岛入队
p = 0
while p < len(st):
i, j = st[p]
for dx, dy in dir:
x, y = i + dx, j + dy
if x < 0 or x >= n or y < 0 or y >= m or grid[x][y] != 1:
continue
st.append((x, y))
grid[x][y] = -1
p += 1
# 多源 BFS 找最短路
for step in range(n * m + 1):
st2 = list()
for i, j in st:
for dx, dy in dir:
x, y = i + dx, j + dy
if x < 0 or x >= n or y < 0 or y >= m or grid[x][y] == -1:
continue
if grid[x][y] == 1:
return step
st2.append((x, y))
grid[x][y] = -1
st = st2
return -1