每日一题:腐烂的橘子
在给定的网格中,每个单元格可以有以下三个值之一:
值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。
返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/ro…
著作权归领扣网络所有。
解图思路
看到这种一圈圈向外扩散的题目,马上联想到广度优先搜索算法!
那什么是广式优先算法呢
像下图一样,按层搜索就是广式优先算法;
由一个点或者多个点出发,向外扩散搜索;
广式优先算法基本套路是啥
请大家伙记住下面这个公式!看见广式优先搜索 直接往上套 !
for 遍历所有起点
queue.add(起点);
while (!queue.isEmpty()){
int[] start = queue.poll(); // 拿出起点
for 再遍历所有start的子节点
if 判断节点是否有效且没有被访问
queue.add(子节点);
}
腐烂的橘子题解
public int orangesRotting(int[][] grid) {
int[][] dir = new int[][]{{1,0},{-1,0},{0,-1},{0,1}};
int x = grid.length,y = grid[0].length;
Queue<int[]> queue = new LinkedList<>();
int gridNum = 0;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
// 把最开始所有腐烂的橘子,add到队列中
if(grid[i][j] == 2){
queue.add(new int[]{i, j,0});
}
// 记录所有没有腐烂的橘子
if(grid[i][j] == 1){
gridNum++;
}
}
}
int num = 0;
while (!queue.isEmpty()){
int[] xy = queue.poll();
int mx = xy[0],my = xy[1],time = xy[2];
// 取出队列中的一个橘子,遍历它的4边
for (int i = 0; i < 4; i++) {
int x_ = mx + dir[i][0],y_ = my+dir[i][1];
// 设置边界条件
if(x_>=0 && y_>=0 && x_< x && y_<y && grid[x_][y_]!=2){
// 判断橘子是否腐烂,如果没有,假设它腐烂,防止二次计算
if(grid[mx][my] == 1){
queue.add(new int[]{mx, my,time+1});
grid[mx][my] = 2;
gridNum --;
}
}
}
num = time;
}
if(gridNum != 0){
num = -1;
}
return num;
}