腐烂的橘子

题目描述:
在给定的网格中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

思路分析:

  • 每分钟每个腐烂的橘子都会使其上下左右的新鲜橘子腐烂。队列中只让腐烂的橘子入队;
  • 每次记录队列的长度,即为在同一时间内腐烂的橘子
  • 出队时,让当前腐烂橘子四周的新鲜橘子都变为腐烂,直到队列为空
  • 用 time 标记腐烂时间
  • 最后检查网格中是否还有新鲜的橘子 有,返回 -1
class Solution {
    public int orangesRotting(int[][] grid) {
        Queue<Integer> q=new LinkedList<Integer>();
        int time=0;
        int rlen=grid.length;
        int clen=grid[0].length;
        for(int i=0;i<rlen;i++){
            for(int j=0;j<clen;j++){
                if(grid[i][j]==2){
                    int flag=i*clen+j;
                    q.offer(flag);
                }
            }
        }
        while(!q.isEmpty()){
            time++;
            int size=q.size();
            while(size>0){
                int aflag=q.poll();
                int row=aflag/clen;
                int col=aflag%clen;
                if(row>0&&grid[row-1][col]==1){
                    grid[row-1][col]=2;
                    int flag=(row-1)*clen+col;
                    q.offer(flag);
                }
                if(col>0&&grid[row][col-1]==1){
                    grid[row][col-1]=2;
                    int flag=row*clen+col-1;
                    q.offer(flag);
                }
                if(row<rlen-1&&grid[row+1][col]==1){
                    grid[row+1][col]=2;
                    int flag=(row+1)*clen+col;
                    q.offer(flag);
                }
                if(col<clen-1&&grid[row][col+1]==1){
                    grid[row][col+1]=2;
                    int flag=row*clen+col+1;
                    q.offer(flag);
                }
                size--;
            }
        }
        for(int i=0;i<rlen;i++){
            for(int j=0;j<clen;j++){
                if(grid[i][j]==1){
                    return -1;
                }
            }
        }
        return time==0?0:time-1;
    }
}
发布了163 篇原创文章 · 获赞 13 · 访问量 3802

猜你喜欢

转载自blog.csdn.net/qq_42174669/article/details/104654246