Problem: 934. 最短的橋
目錄
- 思路
- 複雜度
- Code
思路
先找到第一個島嶼,根據每一個島嶼的島嶼塊的位置
多源查詢這個塊與第二個島嶼的距離,先找到的就是最少的距離
同時,將已遍歷過的島嶼標記為-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;
}
}