图算法之广度优先遍历

📅 2026/7/6 3:09:06
图算法之广度优先遍历
994. 腐烂的橘子 - 力扣LeetCode广度遍历时间空间都为mxnclass Solution { public int orangesRotting(int[][] grid) { /* 任意位置可能存在腐烂橘子新鲜橘子 count统计新鲜数量 round统计路径长度 先查出所有的腐烂橘子坐标放入队列队列存储腐烂橘子坐标 每轮所有腐烂位置同时广度优先遍历一层保证同时让所有腐烂橘子一起向四周传染一层 然后再把传染的橘子加入队列直到count0或者队列无数据 广度优先遍历要考虑边界和腐烂过的数据 */ int round 0; int count 0 ; Queueint[] queue new LinkedList(); for(int i 0; i grid.length; i){ for(int j 0; j grid[0].length; j){ if(grid[i][j]1){ count; } if(grid[i][j]2){ queue.offer(new int[]{i, j}); } } } while(count 0 !queue.isEmpty()){ round; int n queue.size(); for(int i 0; i n; i){ int[] cur queue.poll(); int r cur[0]; int c cur[1]; if(c-10 grid[r][c-1] 1){ grid[r][c-1]2; count--; queue.offer(new int[]{r,c-1}); } if(c1 grid[0].length grid[r][c1] 1){ grid[r][c1]2; count--; queue.offer(new int[]{r,c1}); } if(r-10 grid[r-1][c] 1){ grid[r-1][c]2; count--; queue.offer(new int[]{r-1,c}); } if(r1grid.length grid[r1][c] 1){ grid[r1][c]2; count--; queue.offer(new int[]{r1,c}); } } } if(count 0){ return -1; }else{ return round; } } }