[LeetCode] 最短的桥 双BFS Java
Problem: 934. 最短的桥
思路
先找到第一个岛屿,根据每一个岛屿的岛屿块的位置
多源查找这个块与第二个岛屿的距离,先找到的就是最少的距离
同时,将已遍历过的岛屿标记为-1,避免重复入队
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n^2)$
空间复杂度:
添加空间复杂度, 示例: $O(n^2)$
Code
class Solution {
public int shortestBridge(int[][] grid) {
int m = grid.length, n = grid[0].length;
int[][] dir = new int[][]{{-1,0}, {1, 0}, {0, -1}, {0, 1}};
List<int[]> firstIsland = new ArrayList<>();
Queue<int[]> queue = new LinkedList<>();
// 找到第一个岛屿
// -1 标记已经遍历过
loop:for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if(grid[i][j] == 1){
queue.offer(new int[]{i, j});
grid[i][j] = -1;
break loop;
}
}
}
while(!queue.isEmpty()){
int[] point = queue.poll();
firstIsland.add(point);
for (int i = 0; i < 4; i++) {
int x = point[0] + dir[i][0];
int y = point[1] + dir[i][1];
if(x>=0&& x<m && y>=0 && y<n && grid[x][y] == 1){
queue.offer(new int[]{x, y});
grid[x][y] = -1;
}
}
}
// 把找到的岛屿块入队
for(int[] island : firstIsland){
queue.offer(island);
}
// 查找第二个岛屿
int step = 0;
while(!queue.isEmpty()){
int size = queue.size();
for (int i = 0; i < size; i++) {
int[] point = queue.poll();
for (int k = 0; k < 4; k++) {
int x = point[0] + dir[k][0];
int y = point[1] + dir[k][1];
if(x>=0&& x<m && y>=0 && y<n){
if(grid[x][y] == 0) {
queue.offer(new int[]{x, y});
grid[x][y] = -1;
}else if (grid[x][y] == 1){
return step;
}
}
}
}
step++;
}
return 0;
}
}
本文作者:XFS小风
本文链接:https://www.cnblogs.com/xiaofengs/p/18181972
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步