• 力扣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. };

  • 相关阅读:
    通信原理 | 滤波器:模拟滤波器和数字滤波器
    XSS-labs通关游戏
    异步&线程池
    Task的用法: Task.Run 和 Task.Factory.StartNew
    yakit使用爆破编码明文_dnslog使用
    Python爬取网站数据
    开利网络拜访福能达集团,探讨如何以分红模式助力企业招商加盟实现新突破
    前端网页打开本地应用程序
    Word通过Adobe打印PDF时总是报错,打开记事本
    【优化算法】最小均值 (LMF) 和最小均方 (LMS) 算法【含Matlab源码 2134期】
  • 原文地址:https://blog.csdn.net/qq_52241267/article/details/141097483