1.png
    类似广度搜索,进行好几轮

    贴一个别人注释的

    1. class Solution {
    2. // dr,dc 配合使用得到 grid[r][c] 上grid[r-1][c]左grid[r][c-1]下grid[r+1][c]右grid[r][c+1]的元素
    3. int[] dr = new int[]{-1, 0, 1, 0};
    4. int[] dc = new int[]{0, -1, 0, 1};
    5. public int orangesRotting(int[][] grid) {
    6. // 获取二维数组的行数row 和 列数 column
    7. int R = grid.length, C = grid[0].length;
    8. // queue : all starting cells with rotten oranges
    9. Queue<Integer> queue = new ArrayDeque();
    10. Map<Integer, Integer> depth = new HashMap();
    11. for (int r = 0; r < R; ++r)
    12. for (int c = 0; c < C; ++c)
    13. if (grid[r][c] == 2) {
    14. int code = r * C + c; // 转化为索引唯一的一维数组
    15. queue.add(code); //存储腐烂橘子
    16. depth.put(code, 0); //存储橘子变为腐烂时的时间,key为橘子的一维数组下标,value为变腐烂的时间
    17. }
    18. int ans = 0;
    19. while (!queue.isEmpty()) {
    20. int code = queue.remove();
    21. int r = code / C, c = code % C;
    22. for (int k = 0; k < 4; ++k) {
    23. int nr = r + dr[k];
    24. int nc = c + dc[k];
    25. if (0 <= nr && nr < R && 0 <= nc && nc < C && grid[nr][nc] == 1) {
    26. grid[nr][nc] = 2;
    27. int ncode = nr * C + nc;
    28. queue.add(ncode);
    29. // 计次的关键 元素 grid[r][c] 的上左下右元素得腐烂时间应该一致
    30. depth.put(ncode, depth.get(code) + 1);
    31. ans = depth.get(ncode);
    32. }
    33. }
    34. }
    35. //检查grid,此时的grid能被感染已经都腐烂了,此时还新鲜的橘子无法被感染
    36. for (int[] row: grid)
    37. for (int v: row)
    38. if (v == 1)
    39. return -1;
    40. return ans;
    41. }
    42. }