• 52、图论-腐烂的橘子


    思路:

    思维转化:

    第一步先找出所有腐烂的橘子,这些橘子会在上下左右进行感染,然后记录被感染的 橘子,之前感染过的句子不再使用,将新的感染的橘子收集,然后遍历让其上下左右依次感染,没做一次批量感染,时间加1。

    直到无法在搜集新的感染橘子的时候,判断感染橘子的总和和橘子的数量是否相等,如果相等返回最小分钟数,如果不相等,说明有些橘子无法被感染,返回-1。

    代码如下:

    1. class Solution {
    2. public int orangesRotting(int[][] grid) {
    3. // 如果网格为空或者行或列的长度为0,直接返回0,因为没有橘子。
    4. if (grid == null || grid.length == 0 || grid[0].length == 0) {
    5. return 0;
    6. }
    7. int num = 0; // 新鲜橘子的数量
    8. Queue<int[]> queue = new LinkedList<>(); // 用于BFS的队列
    9. int N = grid.length; // 网格的行数
    10. int M = grid[0].length; // 网格的列数
    11. // 遍历整个网格
    12. for (int i = 0; i < N; i++) {
    13. for (int j = 0; j < M; j++) {
    14. // 如果找到一个腐烂的橘子,就将它的位置加入队列
    15. if (grid[i][j] == 2) {
    16. int[] position = {i, j};
    17. queue.add(position);
    18. }
    19. // 如果找到一个新鲜的橘子,新鲜橘子的数量加一
    20. if (grid[i][j] == 1) {
    21. num++;
    22. }
    23. }
    24. }
    25. // 如果没有新鲜橘子,直接返回0,因为没有橘子需要腐烂
    26. if (num == 0) {
    27. return 0;
    28. }
    29. int count = 0; // 记录所需分钟数
    30. int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; // 四个可能的移动方向(上下左右)
    31. // 当队列不为空,并且还有新鲜的橘子时,进行BFS
    32. while (!queue.isEmpty() && num > 0) {
    33. int size = queue.size(); // 当前队列的大小,代表这一分钟可以腐烂的橘子数量
    34. for (int i = 0; i < size; i++) {
    35. int[] point = queue.poll(); // 取出一个腐烂的橘子
    36. // 遍历四个方向
    37. for (int[] direction : directions) {
    38. int x = point[0] + direction[0];
    39. int y = point[1] + direction[1];
    40. // 如果相邻的橘子是新鲜的,它就会腐烂
    41. if (x >= 0 && y >= 0 && x < N && y < M && grid[x][y] == 1) {
    42. grid[x][y] = 2; // 标记为腐烂
    43. queue.add(new int[]{x, y}); // 将新腐烂的橘子加入队列
    44. num--; // 新鲜橘子的数量减少
    45. }
    46. }
    47. }
    48. count++; // 每完成一轮BFS,时间增加一分钟
    49. }
    50. // 如果没有新鲜橘子剩余,返回所需的时间,否则返回-1表示有橘子永远不会腐烂
    51. return num == 0 ? count : -1;
    52. }
    53. }

     

  • 相关阅读:
    杰理之MIDI 解码方式共有 4 种,分别是【篇】
    python文件打包找不到文件路径
    mysql数据库insert、select、delete、update基本语法的使用
    Java 多线程写zip文件遇到的错误 write beyond end of stream!
    可拖动、可靠边的 popupWindow 实现
    mannose-OH|甘露糖-羟基|mannose-PEG-OH|甘露糖-聚乙二醇-羟基
    匿名共享内存 ashmem
    java uniapp旅游微信小程序的开发hbuilderx
    WPF TreeView数据回填
    示例:WPF中绑定枚举到ComboBox想显示成中文或自定义名称如何实现
  • 原文地址:https://blog.csdn.net/qq_29434541/article/details/138096700