01矩阵
问题
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1。
方法
将找每个元素距离最近的0转换为从0向外找1,因为如果该位置元素为0,那么他到0的距离就是0,所以找到1的距离就是1到0的距离。用广度优先算法来寻找最短距离。
//广度优先算法 ---从0向四周搜索1,就是最短路径
public int[][] updateMatrix(int[][] matrix) {
Queue<int[]> queue=new LinkedList<int[]>();
int n=matrix.length;
int m=matrix[0].length;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++) {
if(matrix[i][j]==1) {
matrix[i][j]=Integer.MAX_VALUE;//标记没有走过
}
else
queue.offer(new int[] {i,j});//将0入队伍
}
int[] x1=new int[] {1,-1,0,0};//定义四个方向
int[] y1=new int[] {0,0,1,-1};
while(!queue.isEmpty())
{
int[] num=queue.poll();//出队伍
for(int i=0;i<4;i++) {
int nx=num[0]+x1[i];
int ny=num[1]+y1[i];//将当前位置向前/后/左/右走
if(nx>=0&&nx<=n&&ny>=0&&ny<=m&&matrix[nx][ny]==Integer.MAX_VALUE) {//找到了未标记的1,其距离就是上一个位置的数加1
matrix[nx][ny]=matrix[num[0]][num[1]]+1;
queue.offer(new int[] {nx,ny});
}
}
}
return matrix;
}