1.题目描述
1.1笔者分析
对于Tree的BFS大家都已经掌握的不错了:要把root结点先入队,然后再一层一层的无脑遍历就行了。对于图的BFS也是一样滴~与Tree的BFS区别如下:
1.tree只有一个root,而图可以有多个源点,所以首先要把多个源点都入队。
2.tree是有向的因此不需要标志是否访问过,而对于无向图来说,必须标志是否访问过。而且为了防止某个结点多次入队,需要在入队之前就将其设置成已访问。
对于本题而言,我们只要先把所有的陆地都入队,然后从各个陆地同时开始一层层的向海洋扩散,那么最后扩散到的海洋就是最远的海洋!并且这个海洋肯定是被离他最近的陆地给扩散到的!
参考链接
在这里插入代码片class Solution {
public int maxDistance(int[][] grid) {
int[] dx = {0, 0, 1, -1};
int[] dy = {1, -1, 0, 0};
Queue<int[]> queue = new ArrayDeque<>();
int m = grid.length, n = grid[0].length;
// 先把所有的陆地都入队。
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});
}
}
}
// 从各个陆地开始,一圈一圈的遍历海洋,最后遍历到的海洋就是离陆地最远的海洋。
boolean hasOcean = false;
int[] point = null;
while (!queue.isEmpty()) {
point = queue.poll();
int x = point[0], y = point[1];
// 取出队列的元素,将其四周的海洋入队。
for (int i = 0; i < 4; i++) {
int newX = x + dx[i];
int newY = y + dy[i];
if (newX < 0 || newX >= m || newY < 0 || newY >= n || grid[newX][newY] != 0) {
continue;
}
grid[newX][newY] = grid[x][y] + 1; // 这里我直接修改了原数组,因此就不需要额外的数组来标志是否访问
hasOcean = true;
queue.offer(new int[] {newX, newY});
}
}
// 没有陆地或者没有海洋,返回-1。
if (point == null || !hasOcean) {
return -1;
}
// 返回最后一次遍历到的海洋的距离。
return grid[point[0]][point[1]] - 1;
}
}
强啊!
本文介绍了一种使用广度优先搜索(BFS)算法在二维网格中寻找距离陆地最远海洋的方法。通过将所有陆地标记为起点并进行BFS遍历,可以有效地找出最远的海洋及其距离。
758

被折叠的 条评论
为什么被折叠?



