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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值