力扣刷题——542. 01 矩阵
542. 01 矩阵
用广度优先搜索,需要用到队列,也可以用动态规划写,下面用广度优先搜索写
从0开始向周边搜索,所有0一开始视为一个整体0,开始全部0标记,后面找到新的格子就标记加入队列并让格子的数值+1
package leetcode;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class T542 {
public static void main(String[] args) {
int[][] a = new T542().new Solution().updateMatrix(new int[][] { { 0, 0, 0 }, { 0, 1, 0 }, { 1, 1, 1 } });
System.out.println(Arrays.deepToString(a));
}
class Solution {
// 位置偏移量
int[] r = { 0, -1, 0, 1 };
int[] c = { -1, 0, 1, 0 };
public int[][] updateMatrix(int[][] mat) {
int m = mat.length, n = mat[0].length;
int[][] ans = new int[m][n];// 默认初始化全为0
boolean[][] flag = new boolean[m][n];// 默认初始化全为false,用来标记
// 队列,用于广度搜索,记录的是坐标
Queue<int[]> queue = new LinkedList<>();
// 先记下所有0的坐标并标记
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (mat[i][j] == 0) {
queue.offer(new int[] { i, j });
flag[i][j] = true;
}
}
}
while (!queue.isEmpty()) {
int[] tmp = queue.poll();
int x = tmp[0], y = tmp[1];
// 查找四个方向
for (int i = 0; i < 4; ++i) {
int nx = x + r[i], ny = y + c[i];
// 检查边界并且未被标记
if (nx >= 0 && ny >= 0 && nx < m && ny < n && flag[nx][ny] == false) {
// 加入队列
queue.offer(new int[] { nx, ny });
// 增加数值
ans[nx][ny] = ans[x][y] + 1;
// 标记
flag[nx][ny] = true;
}
}
}
return ans;
}
}
}
写的时候又犯了一些粗心的错误,找四个方向时又用了双重for循环。。
posted on 2023-02-19 16:25 pumpkinsBig 阅读(16) 评论(0) 收藏 举报
浙公网安备 33010602011771号