542. 01 矩阵(dj的应用)

四月十六号,明天准备开始图的学习了,这两天做了几个广度优先的算法题,每个题都有一些不同,有的是单源广度优先,有的是多源广度优先,下面这个题,是多源广度优先算法的应用,那么我们列出题目:

在做这种,有可能涉及多源广度的问题时候,我们一定要考虑清楚,谁作为源头是最合适的呢?这道题我们分析一下,首先找到每个元素最近的0!我们很容易就把1当做源头加进去了,一圈一圈的找,直到找到0.。但是我们找1作为源头时候,我们必须每次都更新1的值,所以很麻烦,我们应该把每个0都加进去,一层一层的寻找,第一次广度优先找的是所有不为0并且是1的(距离也是1),第二次把第一次加进去,更新层数,那么就是第二次的以此类推,下面我们列出代码:

class Solution {
    public int[][] updateMatrix(int[][] matrix) {
        int[][] res=new int[matrix.length][matrix[0].length];
        Queue<int[]>queue=new LinkedList<>();
        boolean[][] visited=new boolean[matrix.length][matrix[0].length];
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
                if(matrix[i][j]==0) {
                    visited[i][j]=true;
                    queue.add(new int[]{i,j});
                }
            }
        }
        int level=0;
        int[][] direction=new int[][]{
                {0,1},{0,-1},{1,0},{-1,0}
        };
        while (!queue.isEmpty()){
            int size=queue.size();
            for(int i=0;i<size;i++){
                int[] temp=queue.poll();
                res[temp[0]][temp[1]]=level;
                for(int[] di:direction){
                    int[]newLabel=new int[2];
                    newLabel[0]=temp[0]+di[0];
                    newLabel[1]=temp[1]+di[1];
                    if(newLabel[0]>=matrix.length||newLabel[0]<0||newLabel[1]>=matrix[0].length||newLabel[1]<0||visited[newLabel[0]][newLabel[1]]) continue;
                    visited[newLabel[0]][newLabel[1]]=true;
                    queue.add(new int[]{newLabel[0],newLabel[1]});
                }
            }
            level++;
        }
        return res;
    }
}

这种题,一定要找好源的选择!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值