四月十六号,明天准备开始图的学习了,这两天做了几个广度优先的算法题,每个题都有一些不同,有的是单源广度优先,有的是多源广度优先,下面这个题,是多源广度优先算法的应用,那么我们列出题目:
在做这种,有可能涉及多源广度的问题时候,我们一定要考虑清楚,谁作为源头是最合适的呢?这道题我们分析一下,首先找到每个元素最近的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;
}
}
这种题,一定要找好源的选择!