一、问题描述
二、解题思路
此问题通过广度优先遍历来解决,模拟苹果发霉变坏的过程
1.初始时遍历网格,借助队列来储存所有发霉的苹果,统计好苹果个数
2.每一分钟队列内发霉苹果都会对周围的苹果起作用(向外部扩散),所以把队列内所有发霉苹果依次弹出,对每个弹出的发霉苹果四周进行判断,传染健康苹果,然后把传染的健康苹果再次加入发霉队列中,这样就模拟了每一分钟的向外扩散过程。
3.只要还有好苹果并且发霉列表内不为空,就重复执行上述操作(每次重复,时间统计+1)。
4.当好苹果数量为0时,说明全部扩散完成,返回上述统计的时间;当队列内发霉苹果数量为0,此时健康苹果数量不是0时,意味着好苹果被空格隔离起来了,永远不会变质,则返回-1。
三、代码实现
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param grid int整型ArrayList<ArrayList<>> * @return int整型*/public int rotApple (ArrayList<ArrayList<Integer>> grid) {int useTime=0;int healthyApple=0;//对应上下左右坐标变换int[] dx={0,0,-1,1};int[] dy={1,-1,0,0};int n=grid.size(),m=grid.get(0).size();//设置队列,存储发霉苹果Queue<int[]> appleQue=new LinkedList<>();//统计发霉苹果和健康苹果for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(grid.get(i).get(j)==2){appleQue.offer(new int[]{i,j});}else if(grid.get(i).get(j)==1){healthyApple++;}}}//从队列中弹出发霉水果,看是否会影响到周围,模拟传播过程,更新健康苹果数量//如果不再产生影响(队列为空),则证明完成传播过程//查看健康苹果个数是否为0,如果不是0则证明永远不会发霉,返回-1//如果是0则返回传播时间useTimewhile(healthyApple>0&&!appleQue.isEmpty()){useTime++;int badSize=appleQue.size();for(int i=0;i<badSize;i++){int[] nowidxArr=appleQue.poll();for(int j=0;j<dx.length;j++){int x=nowidxArr[0]+dx[j];int y=nowidxArr[1]+dy[j];if(x>=0&&x<n&&y>=0&&y<m&&grid.get(x).get(y)==1){grid.get(x).set(y,2);healthyApple--;appleQue.offer(new int[]{x,y});}}}}if(healthyApple==0){return useTime;}else{return -1;}}
}
四、刷题链接
腐烂的苹果_牛客题霸_牛客网