leetCode 994 腐烂的橘子

在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
来源:力扣(LeetCode)

采用广度优先遍历方式,记录遍历的层数,就是腐烂需要的时间。同样的方法也可以用于二叉树的按层遍历。

public int orangesRotting(int[][] grid) {
        int freshNum=0;
        LinkedList<Integer> 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){
                    freshNum++;
                }
                if(grid[i][j]==2){
                    queue.add(i*10+j);
                }
            }
        }
        if(queue.isEmpty()){
            return freshNum>0?-1:0;
        }
        int len=queue.size();
        int step=0;
        while(!queue.isEmpty()){
                int pos=queue.poll();
                int x=pos/10;
                int y=pos%10;
                grid[x][y]=0;
                if(x+1<grid.length&&grid[x+1][y]==1){
                    grid[x+1][y]=2;
                    queue.offer((x+1)*10+y);
                    freshNum--;
                }
                if(x-1>=0&&grid[x-1][y]==1){
                    grid[x-1][y]=2;
                    queue.offer((x-1)*10+y);
                    freshNum--;
                }
                if(y+1<grid[0].length&&grid[x][y+1]==1){
                    grid[x][y+1]=2;
                    queue.offer((x)*10+y+1);
                    freshNum--;
                }
                if(y-1>=0&&grid[x][y-1]==1){
                    grid[x][y-1]=2;
                    queue.offer((x)*10+y-1);
                    freshNum--;
                }
                len--;
                if(len==0){
                    step++;
                    len=queue.size();
                }
        }
        return freshNum==0?step-1:-1;
    }
发布了47 篇原创文章 · 获赞 1 · 访问量 1585

猜你喜欢

转载自blog.csdn.net/chinamen1/article/details/104839712