Leetcode--994. 腐烂的橘子(java)
发布日期:2021-04-30 21:02:03 浏览次数:90 分类:精选文章

本文共 3071 字,大约阅读时间需要 10 分钟。

为了解决这个问题,我们需要模拟橘子的腐烂过程,计算每分钟腐烂的橘子数量,并统计总时间。我们可以使用广度优先搜索(BFS)来处理每一步的扩散,因为每一步都是由腐烂的橘子感染周围的新鲜橘子。

方法思路

  • 初始化:遍历整个网格,找到所有初始的新鲜橘子(值为1)的位置,并将这些位置加入BFS队列,同时记录它们的腐烂时间(初始为0)。
  • BFS处理:从队列中取出一个橘子,检查它的四个邻居。如果邻居是新鲜橘子且未被腐烂过,将其腐烂时间记录为当前时间+1,并将邻居加入队列。
  • 计算最大时间:在BFS结束后,找到所有腐烂时间中的最大值,这就是所需的最小分钟数。
  • 检查结果:如果有任何新鲜橘子未被腐烂,返回-1;否则,返回最大腐烂时间。
  • 解决代码

    import java.util.*;public class Solution {    public int orangesRotting(int[][] grid) {        if (grid.length == 0) return 0;        int rows = grid.length;        int cols = grid[0].length;        Queue
    queue = new LinkedList<>(); int[][] time = new int[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (grid[i][j] == 1) { time[i][j] = 0; queue.add(new int[]{i, j}); } else { time[i][j] = -1; } } } int maxTime = 0; while (!queue.isEmpty()) { int[] cell = queue.poll(); int i = cell[0]; int j = cell[1]; int currentTime = time[i][j]; // 上 if (i > 0) { int ni = i - 1; int nj = j; if (grid[ni][nj] == 1 && time[ni][nj] == -1) { time[ni][nj] = currentTime + 1; queue.add(new int[]{ni, nj}); maxTime = Math.max(maxTime, time[ni][nj]); } } // 下 if (i < rows - 1) { int ni = i + 1; int nj = j; if (grid[ni][nj] == 1 && time[ni][nj] == -1) { time[ni][nj] = currentTime + 1; queue.add(new int[]{ni, nj}); maxTime = Math.max(maxTime, time[ni][nj]); } } // 左 if (j > 0) { int ni = i; int nj = j - 1; if (grid[ni][nj] == 1 && time[ni][nj] == -1) { time[ni][nj] = currentTime + 1; queue.add(new int[]{ni, nj}); maxTime = Math.max(maxTime, time[ni][nj]); } } // 右 if (j < cols - 1) { int ni = i; int nj = j + 1; if (grid[ni][nj] == 1 && time[ni][nj] == -1) { time[ni][nj] = currentTime + 1; queue.add(new int[]{ni, nj}); maxTime = Math.max(maxTime, time[ni][nj]); } } } // 检查是否有未被腐烂的1 boolean hasFresh = false; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (grid[i][j] == 1 && time[i][j] == -1) { hasFresh = true; break; } } if (hasFresh) break; } return hasFresh ? -1 : maxTime; }}

    代码解释

  • 初始化:遍历网格,找到所有初始的新鲜橘子位置,并将它们加入队列,同时初始化时间矩阵。
  • BFS处理:从队列中取出橘子,检查四个方向的邻居,如果邻居是新鲜橘子且未被腐烂,记录腐烂时间并加入队列。
  • 计算最大时间:在BFS结束后,找到所有腐烂时间中的最大值。
  • 检查结果:如果存在未被腐烂的新鲜橘子,返回-1;否则,返回最大腐烂时间。
  • 上一篇:Java中的异常触发都是通过throw主动抛出
    下一篇:Leetcode--174. 地下城游戏

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2026年06月18日 19时17分29秒