做题博客链接
https://blog.csdn.net/qq_43349112/article/details/108542248
题目链接
https://leetcode-cn.com/problems/01-matrix/
描述
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
提示:
给定矩阵的元素个数不超过 10000。
给定矩阵中至少有一个元素是 0。
矩阵中的元素只在四个方向上相邻: 上、下、左、右。
示例
示例 1:
输入:
[[0,0,0],
[0,1,0],
[0,0,0]]
输出:
[[0,0,0],
[0,1,0],
[0,0,0]]
示例 2:
输入:
[[0,0,0],
[0,1,0],
[1,1,1]]
输出:
[[0,0,0],
[0,1,0],
[1,2,1]]
初始代码模板
class Solution {
public int[][] updateMatrix(int[][] matrix) {
}
}
代码
BFS模板题
class Solution {
private int[] dx = {1, -1, 0, 0};
private int[] dy = {0, 0, 1, -1};
public int[][] updateMatrix(int[][] matrix) {
Queue<Integer> queue = new LinkedList<>();
int r = matrix.length;
int c = matrix[0].length;
boolean[][] vis = new boolean[r][c];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (matrix[i][j] == 0) {
queue.offer(i * c + j);
vis[i][j] = true;
}
}
}
//开始进行扩展
int dis = 1;
while (!queue.isEmpty()) {
for (int size = queue.size(); size > 0; size--) {
int loc = queue.poll();
int x = loc / c;
int y = loc % c;
for (int i = 0; i < dx.length; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < r && ny >= 0 && ny < c && !vis[nx][ny]) {
vis[nx][ny] = true;
matrix[nx][ny] = dis;
queue.offer(nx * c + ny);
}
}
}
dis++;
}
return matrix;
}
}