934 最短的桥
01
超时!
首先随机搜索,找到一个岛,然后使用DFS将这个岛的所有1变成2,并将1旁边的0都收集起来,为下面的步骤做准备。随后,对每一个收集来的0进行BFS,直到找到第二个岛。
class Solution {
Queue<int[]> que=new LinkedList<>();
int [][] dir=new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
public int shortestBridge(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
boolean flipped = false;
for (int i = 0; i < m; i++) {
if (flipped){
break;
}
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
dfs(grid, i, j);
flipped=true;
break;
}
}
}
int level=0;
while (!que.isEmpty()){
int n_points=que.size();
++level;
while (n_points-- >0) {
int[] poll = que.poll();
int x=poll[0];
int y=poll[1];
grid[x][y]=2;
for (int i=0;i<dir.length;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if (tx<0 || ty<0 || tx>=m || ty>=n || grid[tx][ty]==2){
continue;
}
if (grid[tx][ty]==1){
return level;
}
que.add(new int[]{tx,ty});
// grid[tx][ty]=2;
}
}
}
return 0;
}
public void dfs(int[][] grid, int i, int j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length ||grid[i][j]==2) {
return;
}
if (grid[i][j]==0){
que.add(new int[]{i,j});
return;
}
grid[i][j] = 2;
dfs(grid, i - 1, j);
dfs(grid, i + 1, j);
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
}
02
class Solution {
Queue<int[]> que=new LinkedList<>();
int [][] dir=new int[][]{{-1,0},{1,0},{0,-1},{0,1}};
public int shortestBridge(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
boolean flipped = false;
for (int i = 0; i < m; i++) {
if (flipped){
break;
}
for (int j = 0; j < n; j++) {
if (grid[i][j] == 1) {
dfs(grid, i, j);
flipped=true;
break;
}
}
}
int level=0;
while (!que.isEmpty()){
int n_points=que.size();
++level;
while (n_points-- >0) {
int[] poll = que.poll();
int x=poll[0];
int y=poll[1];
// grid[x][y]=2;
for (int i=0;i<dir.length;i++){
int tx=x+dir[i][0];
int ty=y+dir[i][1];
if (tx<0 || ty<0 || tx>=m || ty>=n || grid[tx][ty]==2){
continue;
}
if (grid[tx][ty]==1){
return level;
}
grid[tx][ty]=2;
que.add(new int[]{tx,ty});
// grid[tx][ty]=2;
}
}
}
return 0;
}
public void dfs(int[][] grid, int i, int j) {
if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length ||grid[i][j]==2) {
return;
}
if (grid[i][j]==0){
grid[i][j]=2;//这里设为2,bfs的时候就不会遍历第一层0了,否则会遍历第一层0,就会超时,如上面的代码。
que.add(new int[]{i,j});
return;
}
grid[i][j] = 2;
dfs(grid, i - 1, j);
dfs(grid, i + 1, j);
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
}