[LeetCode] 542. 01 Matrix

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 542. 01 Matrix相关的知识,希望对你有一定的参考价值。

01矩阵。题意是给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。例子,

Example 1:

Input:
[[0,0,0],
 [0,1,0],
 [0,0,0]]

Output:
[[0,0,0],
 [0,1,0],
 [0,0,0]]

Example 2:

Input:
[[0,0,0],
 [0,1,0],
 [1,1,1]]

Output:
[[0,0,0],
 [0,1,0],
 [1,2,1]]

因为是找matrix里面的最短距离,所以思路是BFS。首先将所有值为0的元素都加入queue,再将所有不为0的元素全都标记成Integer.MAX_VALUE。然后按照BFS的正常思路遍历queue中的每个点。在扫描每个点的时候,如果超出input边界,或者这个点和他自己四个邻居点之间的差值小于等于1的时候则直接跳过,理由是因为两个点之间最短的距离也只可能是1。跳过了这些case之后,再被加入queue的应该只有可能是一开始被标记成Integer.MAX_VALUE的坐标值了。如果这些点在某一次扫描中被发现了,他们就会被标记成1然后再次放入queue。

这个做法巧妙的地方在于先将值为1的坐标改成Integer.MAX_VALUE,这样越靠近0的点会被越先改成1。被改成1的坐标旁边如果还有Integer.MAX_VALUE,会在被找到之后再被赋值为1 + 1 = 2。参考第二个例子。

时间O(mn)

空间O(mn) - worse case可能所有元素都要经过一遍queue

Java实现

 1 class Solution {
 2     public int[][] updateMatrix(int[][] matrix) {
 3         int m = matrix.length;
 4         int n = matrix[0].length;
 5         Queue<int[]> queue = new LinkedList<>();
 6         for (int i = 0; i < m; i++) {
 7             for (int j = 0; j < n; j++) {
 8                 if (matrix[i][j] == 0) {
 9                     queue.offer(new int[] { i, j });
10                 } else {
11                     matrix[i][j] = Integer.MAX_VALUE;
12                 }
13             }
14         }
15         int[][] dirs = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
16         while (!queue.isEmpty()) {
17             int[] point = queue.poll();
18             for (int[] dir : dirs) {
19                 int row = point[0] + dir[0];
20                 int col = point[1] + dir[1];
21                 if (row < 0 || row >= m || col < 0 || col >= n || matrix[row][col] <= matrix[point[0]][point[1]] + 1) {
22                     continue;
23                 }
24                 queue.offer(new int[] { row, col });
25                 matrix[row][col] = matrix[point[0]][point[1]] + 1;
26             }
27         }
28         return matrix;
29     }
30 }

 

以上是关于[LeetCode] 542. 01 Matrix的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 542. 01 Matrix

leetcode 542. 01 Matrix 01 矩阵(中等)

leetcode542 01 Matrix

LeetCode542. 01 Matrix

[LeetCode] 542. 01 Matrix

[leetcode] 542. 01 Matrix (Medium)