994.腐烂的橘子

问题描述

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

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

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

输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4
示例 2:

输入:[[2,1,1],[0,1,1],[1,0,1]]
输出:-1
解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个正向上。
示例 3:

输入:[[0,2]]
输出:0
解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。

提示:

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2

问题分析

类似层次遍历,使用队列求解。

首先,将原数组中所有腐烂的橘子(即值为2)的唯一标识入队列(使用0,1,2,3…作为唯一标识可用 当前横坐标*列数+当前纵坐标 求得);使用Map键值对记录每个橘子腐烂的时间点<,初始腐烂橘子的腐烂时间为0;

然后,将队头元素hnode出队列,判断其四周(上下左右)的是否有好橘子(值为1),有的话,现将橘子的值置为2后入队列,并记录其腐烂的时间点(为头元素腐烂时间+1),如此循环,直至队列为空

最后,循环数组,若仍有值为1的元素(好橘子)则返回-1;

代码实现

class Solution {
    public int orangesRotting(int[][] grid) {
        Queue<Integer> queue = new LinkedList<Integer>();
        Map<Integer,Integer> depth = new HashMap<>();//用于存储每个橘子腐烂的时间点
        int row = grid.length;
        int col = grid[0].length;

        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(grid[i][j]==2){
                    queue.offer(i*col+j);
                    depth.put(i*col+j,0);
                }
            }
        }
//        for(int n:depth.keySet()){
//            System.out.println(n);
//        }
        int time=0;//记录腐烂花费的时间
        int[] dr= new int[]{-1,0,0,1};//上,左,右,下横坐标的变化
        int[] dc= new int[]{0,-1,1,0};//上,左,右,下纵坐标的变化

        //出队列,并将该橘子四周的好橘子腐烂后入队列
        while(!queue.isEmpty()){
            int orange = queue.poll();
            int r = orange/col;
            int c = orange%col;
            for(int k=0;k<4;k++){
                int or=r+dr[k];
                int oc=c+dc[k];
                if(0<=or && or<row && 0<=oc && oc<col && grid[or][oc]==1){
                    grid[or][oc]=2;
                    queue.offer(or*col+oc);
                    depth.put(or*col+oc,depth.get(orange)+1);
                    time = depth.get(or*col+oc);
                }
            }
        }

        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(grid[i][j]==1){
                    return -1;
                }
            }
        }
        return time;
    }
}

你可能感兴趣的:(LeetCode)