• 3.1

    • 腐烂的才入队列,且在 while 循环中,一次性取出腐烂橘子,并向每个腐烂橘子四周扩散
    • 新鲜橘子用 fresh 计数,time 遍历初始为 -1,且为 fresh 为 0 时立刻返回 0;以解决边界问题
  • 2.12

    • 记忆点 1:q 存坐标用 int【】泛型
    • fresh 和 time 不一样
    • 声明方向数组不需要 new
    • 每次进入 while 循环 time++,fresh 发现时++
  • 1.30

    • 与岛屿相同,只不过这里取到烂橘子后加入队列开始由方向数组传播(而不是 dfs 传播)
    • 需要注意时间的初始值为-1
  • 11.14

    • 一般,就是BFS,因为是一轮一轮的,每轮取出腐烂橘子遍历(数组方向法),然后腐烂掉记录,加入队列即可
    • 向队列加入新坐标:new int[]{i,j}
    • 在队列取出时,需要在方向数组的遍历下(向下移动)开始判断
    • 判断与岛屿数量相反 !!判断在里且为新鲜橘子,腐烂 ,而岛屿数量是判边界外且为水时,淹掉.本质相同
class Solution {
    public int orangesRotting(int[][] grid) {
        int m=grid.length,n=grid[0].length;
        Queue<int[]> q = new LinkedList<>();
        int fresh = 0;//新鲜橘子记数
        //初始化队列+统计新鲜橘子数量
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==2) q.offer(new int[]{i,j});
                if(grid[i][j]==1) fresh++;
            }
        }
        if(fresh==0) return 0;
        int minutes = -1;
        int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};
        //BFS扩散
        while(!q.isEmpty()){
            int size = q.size();
            minutes++;
            for(int k=0;k<size;k++){
                int[] cur = q.poll();
                int x = cur[0],y=cur[1];
                for(int[] d:dirs){
                    int nx = x+d[0],ny = y+d[1];
                    if(nx>=0&&ny>=0&&nx<m&&ny<n&&grid[nx][ny]==1){
                        grid[nx][ny]=2;
                        fresh--;
                        q.offer(new int[]{nx,ny});
                    }
                }
            }
        }
        return fresh==0?minutes:-1;
    }
}
  • 初始化队列
  • 记录腐烂与新鲜橘子,腐烂橘子的坐标插入队列
  • 制造方向数组
  • 开始bfs:取出一个腐烂橘子开始扩散,岛屿判断,新鲜减一,腐烂加入队列