​LeetCode刷题实战542:01 矩阵

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 01 矩阵,我们先来看题面:

https://leetcode-cn.com/problems/01-matrix/

Given an m x n binary matrix mat, return the distance of the nearest 0 for each cell.

The distance between two adjacent cells is 1.

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

示例                         

278b137be403fe38b32c798520f31d14.png


解题

使用广度优先搜索需要从0开始,一层一层往外寻找。

cebf8a35ed5cf571612d2baf24f1dd9d.png

我们把全部的0入队,并且把原来的1置为-1(说明没有被访问过),然后出队,如果周围有-1,则距离就是出队的元素的数值+1

class Solution {
    public int[][] updateMatrix(int[][] matrix) {
        int N = matrix.length;
        int M = matrix[0].length;
        Deque<int[]> deque = new LinkedList<>();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (matrix[i][j] == 0) //把所有0入队
                    deque.offer(new int[]{i, j});
                if (matrix[i][j] == 1) 
                    matrix[i][j] = -1; //把1都置为-1,表示没有访问过
            }
        }
        int[] xPos = new int[]{0, 0, 1, -1};
        int[] yPos = new int[]{-1, 1, 0, 0};
        while (!deque.isEmpty()) {
            int[] pos = deque.poll();
            for (int i = 0; i < 4; i++) {
                int x = pos[0] + xPos[i];
                int y = pos[1] + yPos[i];
                if (x >= 0 && x < N && y >= 0 && y < M && matrix[x][y] == -1) {
                    //每个出队元素只访问其上下左右四个方向
                    matrix[x][y] = matrix[pos[0]][pos[1]] + 1;
                    deque.offer(new int[]{x, y}); //改变了后入队,检查其上下左右
                }
            }
        }

        return matrix;
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-540题汇总,希望对你有点帮助!

LeetCode刷题实战541:反转字符串 II

3a50e6035b696bf41833679222253c4d.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值