做题
力扣542,一道广度优先搜索的经典题型:给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
思路:
如果只有一个0,可以从0的位置开始进行广度优先搜索,每搜索一个位置,就将距离加1,过程可像下面的步骤:
当像题目这样出现多个零的情况,只需要在进行广度优先搜索的时候,将所有的0的位置加入队列再开始搜索就可以解决了。
当出现两个0的时候,过程即为:
实现代码如下:
public int[][] updateMatrix(int[][] matrix) {
if(matrix == null || matrix.length == 0) return null;
int m = matrix.length;//行数
int n = matrix[0].length;//列数
int[][] ans = new int[m][n];//结果数据集
boolean[][] mark = new boolean[m][n];//访问标记数据集
Queue<int[]> queue = new LinkedList<>();//广搜队列
for(int i=0;i<m;i++) {//将所有的0入队
for(int j=0;j<n;j++) {
if(matrix[i][j] == 0) {
queue.offer(new int[]{i,j});
mark[i][j] = true;
ans[i][j] = 0;
}
}
}
int[][] direct = {{1,0},{0,1},{-1,0},{0,-1}};
while(!queue.isEmpty()) {//DFS
int[] poll = queue.poll();
int i = poll[0];
int j = poll[1];
for(int k=0;k<4;k++) {
int di = i + direct[k][0], dj = j + direct[k][1];//向某一个方向进行移动
if(di>=0 && di<m && dj>=0 && dj<n && !mark[di][dj]) {
ans[di][dj] = ans[i][j] + 1;
mark[di][dj] = true;
queue.offer(new int[]{di,dj});
}
}
}
return ans;
}