题目:给定一个由0s和1s组成的矩阵,求每个元素到最接近0的距离。相邻两个元素的距离为1。给定一个由0和1组成的矩阵,找出每个单元格与最近的0的距离。两个相邻单元格之间的距离为1。示例1:输入:000010000输出:000010000示例2:输入:000010111输出:000010121注意:给定矩阵的元素个数不超过10000。给定矩阵中至少有一个元素为0。矩阵中的元素仅在四个方向上相邻:上、下、左、右。注意:给定矩阵的元素个数不会超过10,000。给定矩阵中至少有一个0。这些单元仅在四个方向上相邻:上、下、左和右。解题思路:关键词:最近,距离。那一定是广度优先搜索。类似上篇文章孤岛数:https://mp.weixin.qq.com/s/BrlMzXTtZWdB7hRfCKNMoQ把这个问题转化成图,即求出每个节点1到节点0的最短路径是什么。从某个节点开始,向上、向下、向左、向右展开,每次展开距离加起来为1,如:输入:111010000转换成图(Graph),每种颜色代表一个层级:这就变成了为了求从某个节点到某个节点的深度。所以这道题有两种思路:以节点1为根节点,求节点与节点0之间的深度,以节点0为根节点,遇到距离最近的节点1时,路径记为1,并再次以记录为1的节点为根节点,继续向内遍历。遇到原来的节点1,重新加1,得到路径2,以此类推。..这两种方法各有优缺点。解决以0节点为根节点的问题,要么开辟一个新的二维数组记录路径,要么先遍历,将所有节点1的值改成不能与路径大小重复的值.以1个节点作为根节点,那么就要进行一些冗余的重复遍历。以0为根节点:逻辑顺序:以下面的二维数组为例:111011001先把原节点值为1的节点改成M(路径无法到达的值值,本题大于10000)先感染节点0附近的M个节点,节点0加1得到1个节点,然后感染节点1附近的M个节点,节点2加1得到2个节点...Java:classSolution{publicint[][]updateMatrix(int[][]matrix){introw=matrix.length,column=matrix[0].length;int[][]neighbors={{0,1},{0,-1},{1,0},{-1,0}};//邻居节点Queue的索引偏移queue=newLinkedList<>();//队列for(inti=0;i=0&&x<行&&a议员;y>=0&&y<列&&矩阵[tmp[0]][tmp[1]]<矩阵[x][y]){矩阵[x][y]=矩阵[tmp[0]][tmp[1]]+1;//该节点的值到附近节点的路径值+1queue.offer(newint[]{x,y});}}}返回矩阵;}}Python3:类解决方案:defupdateMatrix(self,matrix:List[List[int]])->List[List[int]]:row,column=len(matrix),len(matrix[0])nerghbors=[(0,1),(0,-1),(1,0),(-1,0)]queue=collections.deque()foriinrange(row):forjinrange(column):如果matrix[i][j]==0:queue.append((i,j))else:matrix[i][j]=10001whilequeue:x,y=queue.popleft()fori,jinnerghbors:xx=i+xyy=j+yif0<=xxqueue=newLinkedList<>();Setset=newHashSet<>();queue.add(i*column+j);//记录查询的另一种方法while(!queue.isEmpty()){intsize=queue.size();计数+=1;for(intk=0;k=0&&!set.contains((x-1)*column+y)){if(matrix[x-1][y]!=0)队列。添加((x-1)*列+y);否则返回计数;}if(y+1=0&&!set.contains(x*column+y-1)){if(matrix[x][y-1]!=0)queue.add(x*column+y-1);否则返回计数;}}}返回数数;}}Python3:类解决方案:defupdateMatrix(self,matrix:List[List[int]])->List[List[int]]:row,column=len(matrix),len(matrix[0])foriinrange(row):forjinrange(column):ifmatrix[i][j]==1:matrix[i][j]=self.bfs(i,j,matrix,row,column)返回矩阵defbfs(self,i:int,j:int,matrix:List[List[int]],row:int,column:int)->int:queue=collections.deque()count=0节点集=set()queue.append((i,j))whilequeue:size=len(queue)count+=1foriinrange(size):x,y=queue.popleft()ifx+1=0and(x-1,y)不是我n节点集:如果矩阵[x-1][y]!=0:queue.append((x-1,y))否则:如果y+1<列且(x,y+1)不在节点集中,则返回计数:ifmatrix[x][y+1]!=0:queue.append((x,y+1))else:如果y-1>=0且(x,y-1)不在节点集中,则返回计数:ifmatrix[x][y-1]!=0:queue.append((x,y-1))else:returncountreturncount欢迎关注微.信公.众号:爱写Bug