题目链接
腐烂的橘子
题目描述
注意点
- grid[i][j] 仅为 0、1 或 2
- 每分钟,腐烂的橘子周围4个方向上相邻的新鲜橘子都会腐烂
解答思路
- 广度优先遍历找到每分钟腐烂的橘子,将第i - 1分腐烂的橘子都添加到队列中,在第i分钟,第i - 1分腐烂的橘子相邻方向的新鲜橘子也会腐烂,重复该操作直到没有新鲜橘子或队列中没有腐烂橘子为止
代码
class Solution {
    public int orangesRotting(int[][] grid) {
        int res = 0;
        int freshSum = 0;
        int row = grid.length;
        int col = grid[0].length;
        int[][] direction = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        Deque<int[]> deque = new ArrayDeque<>();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (grid[i][j] == 1) {
                    freshSum++;
                }
                if (grid[i][j] == 2) {
                    deque.offerLast(new int[]{i, j});
                }
            }
        }
        while (freshSum > 0 && !deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                int[] loc = deque.pollFirst();
                for (int j = 0; j < direction.length; j++) {
                    int x = loc[0] + direction[j][0];
                    int y = loc[1] + direction[j][1];
                    if (x >= 0 && x < row && y >= 0 && y < col && grid[x][y] == 1) {
                        grid[x][y] = 2;
                        freshSum--;
                        deque.offerLast(new int[]{x, y});
                    }
                }
            }
            res++;
        }
        return freshSum == 0 ? res : -1;
    }
}
关键点
- 广度优先遍历的思想
- 队列中只存储第i - 1分腐烂的橘子,在这之前腐烂的橘子应该已经出队
- 橘子腐烂需要同步将grid该位置的状态修改为腐烂,也就是2





















