542. 01マトリックス(djの適用)

4月16日、私は明日、グラフの学習を開始します。過去2日間に、幅優先アルゴリズムの質問をいくつか作成しました。各質問には、いくつかの違いがあります。単一ソースの幅優先の質問と、複数ソースの幅優先の質問があります。次の質問、マルチソース幅優先アルゴリズムのアプリケーションである場合は、トピックをリストします。

これを行うには、複数の幅のソースが含まれる可能性があります。誰が最も適切なソースであるかを明確に検討する必要がありますか?この質問を分析してみましょう。最初に、各要素の最も近い0を見つけます。ソースとして1を簡単に追加し、0が見つかるまで一度に1つの円を検索できます。しかし、ソースとして1を探す場合、毎回1の値を更新する必要があるため、非常に面倒です。各0をレイヤーごとに追加する必要があります。最初の幅の優先順位は、すべての非アクションを見つけることです。 0と1(距離も1)で、1回目を2回目に追加し、レイヤー数を更新してから、2回目などとなります。以下にコードを示します。

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;
    }
}

この種の問題については、適切なソースを見つける必要があります。

元の記事を公開17件 ・いい ね0 訪問数142

おすすめ

転載: blog.csdn.net/qq_33286699/article/details/105570235