• 力扣Hot100-994腐烂的橘子


    中等

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

    • 值 0 代表空单元格;
    • 值 1 代表新鲜橘子;
    • 值 2 代表腐烂的橘子。

    每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

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

    示例 1:

    输入:grid = [[2,1,1],[1,1,0],[0,1,1]]
    输出:4
    

    示例 2:

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

    示例 3:

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

    提示:

    • m == grid.length
    • n == grid[i].length
    • 1 <= m, n <= 10
    • grid[i][j] 仅为 01 或 2

    思路:使用time记录当前的分钟数

    由于在找到腐烂水果后直接将它周围的水果置为腐烂水果,但是可能当前轮次腐烂的水果,又在当前轮次中影响周围水果,导致错误,所以可以标记:在不同轮次中被传染腐烂的水果标记为不同的数字,由于一开始time=0时,腐烂水果标记为2,所以在time=0到1这段时间被传染的水果标记为2+time+1,这样就可以使得本轮time=0时不会让标记为3的水果传染它周围的水果

    1. class Solution {
    2. // 1:判断第i分钟第一次遇到未腐烂橘子,则time++表示还需要一分钟
    3. // 判断橘子完全腐烂时,将flag!=-1;
    4. // 当经过两轮剩余的未腐烂个数仍然相同说明不可能腐烂
    5. //逻辑错误,在找到腐烂水果后直接将它周围的水果置为腐烂水果,但是可能当前轮次腐烂的水果,又在当前轮次中影响周围水果,导致错误
    6. //解决,用不同数字标记,第0轮,为2,则下一轮依次+1
    7. public:
    8. bool in(vectorint>>& grid,int i,int j){
    9. return i>=0&&isize()&&j>=0&&j0].size();
    10. }
    11. int orangesRotting(vectorint>>& grid) {
    12. int time = 0;
    13. int flag = -1;
    14. int good = 0;
    15. for (int i = 0; i < grid.size(); i++) {
    16. for (int j = 0; j < grid[0].size(); j++) {
    17. if (grid[i][j] == 1)
    18. good++;
    19. }
    20. }
    21. if (good == 0)
    22. return 0;
    23. while (good > 0) {
    24. int pre = good; // 该轮未进行前 新鲜的个数
    25. for (int i = 0; i < grid.size(); i++) {
    26. for (int j = 0; j < grid[0].size(); j++) {
    27. if (grid[i][j] ==2+time) { // 有腐烂的橘子,对四周进行判断,有新鲜水果就腐烂
    28. if (in(grid,i,j-1)&&grid[i][j - 1] == 1) {
    29. grid[i][j - 1] = 2+time+1;
    30. good--;
    31. }
    32. if (in(grid,i,j+1)&&grid[i][j + 1] == 1) {
    33. grid[i][j + 1] = 2+time+1;
    34. good--;
    35. }
    36. if (in(grid,i-1,j)&&grid[i - 1][j] == 1) {
    37. grid[i - 1][j ] = 2+time+1;
    38. good--;
    39. }
    40. if (in(grid,i+1,j)&&grid[i + 1][j] == 1) {
    41. grid[i +1][j ] = 2+time+1;
    42. good--;
    43. }
    44. }
    45. }
    46. }
    47. if (pre == good & good > 0)
    48. return -1; // 剩余的不可能腐烂
    49. time++;
    50. }
    51. return time;
    52. }
    53. };

  • 相关阅读:
    DDR时序
    Windows开启linux子系统并迁移到非系统盘
    JavaS
    Wissen Onkel kochen.Et eveniet tenetur inventorEnim a consectetur voluptas.e.
    7、css3实现边框不停地跑动效果
    Java利用AOP切面编程实现数据分页
    屋顶太阳能光伏系统的性能分析指标研究
    JVM入个门(1)
    计算机网络 4 - 网络层
    Greenplum-表的存储模式
  • 原文地址:https://blog.csdn.net/qq_52241267/article/details/141097483