核心内容摘要
成色18K.8811.7V91蓝莓
思路/步骤以下图为例1统计所有初始就腐烂的橘子的位置加到列表q中现在q [(0,
]。
2初始化答案ans 0模拟橘子腐烂的过程不断循环直到没有新鲜的橘子或者q为空。
3ans加1在第ans 1分钟遍历q中橘子的四方向相邻的新鲜橘子把这些橘子腐烂q更新为这些橘子的位置现在q [(0,
,(1,
]。
4ans加1在第ans 2分钟遍历q中橘子的四方向相邻的新鲜橘子把这些橘子腐烂q更新为这些橘子的位置现在q [(0,
,(1,
]。
5ans加1在第ans 3分钟遍历q中橘子的四方向相邻的新鲜橘子把这些橘子腐烂q更新为这些橘子的位置现在q [(2,
]。
6ans加1在第ans 4分钟遍历q中橘子的四方向相邻的新鲜橘子把这些橘子腐烂q更新为这些橘子的位置现在q [(2,
]。
7由于没有新鲜橘子退出循环。
为了判断是否有永远不会腐烂的橘子如示例2我们可以统计初始新鲜橘子的个数fresh。
在BFS中每有一个新鲜橘子被腐烂就把fresh减一这样最后如果发现fresh0就意味着有橘子永远不会腐烂返回-1。
疑问如果代码中不在while循环中判断fresh0会发生什么答会在腐烂完所有新鲜橘子后多循环一次这会导致ans比实际多1。
复杂度分析1时间复杂度O(mn)其中m和n分别为grid的行数和列数。
2空间复杂度O(mn)。
附代码class Solution { private static final int[][] DIRECTIONS ; //四方向 public int orangesRotting(int[][] grid) { int m grid.length; int n grid[0].length; int fresh 0; Listint[] q new ArrayList(); for(int i 0;i m;i){ for(int j 0;j n;j){ if(grid[i][j]