【BFS】LeetCode 542. 01 矩阵
题目链接
思路
题目让求1到0的距离,其实可以转换成求0到1的距离,将所有的0作为源结点放入队列进行BFS。
BFS本质上就是从源点开始的搜索算法,本题只不过是所有的0都是源点,即多源点,将所有源点放入队列就行。
如果0的旁边没有1,则不会对其周围进行访问;如果0的周围有1,则会访问1的坐标,并修改其中的值为距离。
代码
class Solution {
public int[][] updateMatrix(int[][] mat) {
Queue<Pair<Integer, Integer>> queue = new LinkedList<>();
boolean[][] visited = new boolean[mat.length][mat[0].length];
for(int i = 0; i < mat.length; i++){
for(int j = 0; j < mat[i].length; j++){
if(mat[i][j] == 0){
queue.offer(new Pair<>(i, j));
visited[i][j] = true;
}
}
}
int[] dx = new int[]{1, 0, -1, 0};
int[] dy = new int[]{0, 1, 0, -1};
while(!queue.isEmpty()){
Pair<Integer, Integer> currentPos = queue.remove();
for(int i = 0; i < 4; i++){
int nextX = currentPos.getKey() + dx[i];
int nextY = currentPos.getValue() + dy[i];
if(valid(nextX, nextY, visited, mat)){
mat[nextX][nextY] = mat[currentPos.getKey()][currentPos.getValue()] + 1;
queue.offer(new Pair<>(nextX, nextY));
visited[nextX][nextY] = true;
}
}
}
return mat;
}
boolean valid(int nextX, int nextY, boolean[][] visited, int[][] mat){
return (
0 <= nextX && nextX < mat.length && 0 <= nextY && nextY < mat[0].length &&
!visited[nextX][nextY] && mat[nextX][nextY] != 0
);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」