liuxuhelloworld's notebook

题目链接

https://leetcode-cn.com/problems/01-matrix/

解答过程

这个题目是看了官方题解以后写的,自己一开始还是想用DFS,很快就陷入了双向依赖的死循环;也有考虑动态规划,但想的是怎么设计一个统一的动态规划方程,而实际只能是四个方向分别做动态规划。其实从题目要求来看,计算每个节点离最近的0点的距离,BFS应该是更明显的思路,按宽度扩展嘛。对于BFS,关键点在于入队列的时机,即按宽度从小到大入队列。对于本题,就是按距离最近0点的距离入队列。即先入队列的是所有0点,然后入队列的是所有距离0点为1的点,再然后入队列的是所有距离0点为2的点……,以此类推,这样就计算出了每个点到最近的0点的距离。

	int[] dx = new int[] {0, -1, 0, 1};
	int[] dy = new int[] {1, 0, -1, 0};

	public int[][] updateMatrix(int[][] mat) {
		int m = mat.length;
		int n = mat[0].length;

		Queue<int[]> queue = new LinkedList<>();
		boolean[][] visited = new boolean[m][n];

		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if (mat[i][j] == 0) {
					queue.add(new int[] {i, j});
					visited[i][j] = true;
				}
			}
		}

		while (!queue.isEmpty()) {
			int[] cur = queue.poll();
			int curRow = cur[0], curCol = cur[1];
			for (int i = 0; i < 4; i++) {
				int newRow = curRow + dx[i];
				int newCol = curCol + dy[i];
				if (newRow >= 0 && newRow < m
					&& newCol >= 0 && newCol < n
					&& !visited[newRow][newCol]) {
					mat[newRow][newCol] = mat[curRow][curCol] + 1;
					visited[newRow][newCol] = true;
					queue.add(new int[] {newRow, newCol});
				}
			}
		}

		return mat;
	}