一、题目内容
二、题目分析
这道题目是为了查找所有橘子均腐烂时候经过的最小时间,最佳方法是使用BFS,可以将每分钟看做遍历一层,直到遍历完为止。
首先我们要遍历一遍grid数组,找出新鲜橘子的数量count,当后续每次新鲜橘子被腐烂的时候,就让它减一,需要保证count大于0,在遍历grid的时候,还需要将最开始就是腐烂的橘子的坐标放进一个队列中去,以便后续调用。
之后我们在while循环中进行判断,取出队列中的队头,然后获取它的四周的坐标,如果坐标在矩阵grid之内,就判断它的值,只有当它为1的时候,腐烂它,也就是将它的值改成2,并且将它加入队列中,最后再将count-1。
在while循环开始的时候,我们让经历的轮数ans++,因为我们是一层层遍历的,每遍历一层,就是在一分钟之内把能腐蚀的橘子都给腐蚀了。
代码:
class Solution {
public int orangesRotting(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int count = 0;
Queue<int[]>list=new LinkedList<>();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(grid[i][j]==1)
count++;
else if(grid[i][j]==2)
list.add(new int[]{i,j});
}
}
int ans = 0;
int [][]move={{0,1},{0,-1},{1,0},{-1,0}};
while(!list.isEmpty()&&count>0){
ans++;
int size=list.size();
for(int k=0;k<size;k++){
int []point=list.poll();
for(int []cur:move){
int i = point[0]+cur[0];
int j = point[1]+cur[1];
if(i>=0&&i<m&&j>=0&&j<n)
if(grid[i][j]==1){
count--;
grid[i][j]=2;
list.add(new int[]{i,j});
}
}
}
}
if(count>0)
return -1;
return ans;
}
}