LeetCode中的01matrix算法,我本来的的思路是将res矩阵中原矩阵为0的位置都填充为0,并且将该位置(x,y坐标,以长度为2的数组形式)保存到一个ArrayList中,然后遍历原矩阵中为1的位置,次过程中还需逃第三层循环遍历ArrayList,找到离该“1”位置最近的“0”位置(两个位置的x上的距离加y上的距离)。这种方法按理是可行的,而且思路很简单,毕竟我是算法小白。问题是三层循环,会报时间超限错误。研究了一下别人的算法,发现避免三层循环的做法是:
先将矩阵中为0的位置都加入队列(x,y坐标,以长度为2的数组形式),并设置一个dir={{-1, 0}, {1, 0}, {0, -1}, {0, 1}}的数组用于方便求当前点的上下左右点的坐标。然后当队列不为空时,拿出每个当前点A,遍历他的左右上下四个点,若遍历过程中出现越过矩阵边界则直接跳过,或者出现该点(A点上下左右四个点中的一个)的值小于A+1,表明该点的最近0的路径非此条路径,也无需更新,直接跳过;否则将该点也加入队列,并设置该点的值为A点的值+1。java代码如下:
public int[][] updateMatrix(int[][] matrix)
{
int m = matrix.length;
int n = matrix[0].length;
Queue<int[]> queue = new LinkedList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
queue.offer(new int[] {i, j});
}
else {
matrix[i][j] = Integer.MAX_VALUE;
}
}
}
int[][] dir={{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; //上下左右四个点离当前点的距离
while (!queue.isEmpty())
{
int[] unit=queue.poll();
for (int[] pos:dir)
{
int x=unit[0]+pos[0];
int y=unit[1]+pos[1];
if (x < 0 || x >= m || y < 0 || y >= n || matrix[x][y] <= matrix[unit[0]][unit[1]]+1)
continue;
queue.offer(new int[]{x,y});
matrix[x][y]=matrix[unit[0]][unit[1]]+1;
}
}
return matrix;
}
PS:看他们都管这种方法为BFS方法,痛恨自己没学好的树和图。