力扣刷题——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)    收藏  举报

导航