LeetCode中的01矩阵问题

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方法,痛恨自己没学好的树和图。

猜你喜欢

转载自blog.csdn.net/dao_lian/article/details/83898785